%Part 1
from django.conf import settings
if settings.DEBUG:
# Do something
因为django.conf.settings并不是模块而是一个对象,不能像引用对象一样。
不能在程序运行的时候更改settings对象的内容,只能在setting 文件中更改。
进入mysite目录
$ python manage.py runserver
这样就可以开始一个django建立服务端。(这是在做一个网络框架而不是网络服务器)
端口8000是默认的可以更改;
Part 2
mysql连接不上之前要在管理工具中启动mysql服务
并且还要重新添加环境变量;
北京时间是:'UTC+8'
$ python manage.py migrate
这是为了在我们使用相关数据库的时候在我们使用前,自动创建表格;这是与在setting.py中使用是一致的。
接下来要做的是创建模型:
model模型是数据的准确来源,它包含了数据的最基本框架和行为。我们的目的是为了形成一个model让它自动提取数据。
在投票app中创立两个model:question 和 choice
question包括:1.问题;2.出版的日期
choice包括:1.选择的text 2.与之相应的投票
并且:每个选择与一个问题相关联
解释:每个类都代表一个模型;且代表一个数据库表;
每个变量:python中作为一个变量,数据库中作为一列的标题(属性什么的)
foreign key是用来告诉数据库:每个选择都与一个问题相关
接下来要激活模型(创建数据库啥的):
Migrations是Django存储对你的模型的变化的一个过程(他们只是一些硬盘上的文档);
- Change your models (in
models.py
). - Run
python manage.py makemigrations
to create migrations for those changes - Run
python manage.py migrate
to apply those changes to the database.
$ python manage.py shell
不直接使用'python'是因为
manage.py
设置了
DJANGO_SETTINGS_MODULE环境变量,能够在mysite/settings.py
file中给出Django引用的python模块路径
一旦进入了shell中就可以使用数据库API了。
注:使用timezone.now() 而不用datetime.datetime.now()
一个问题:
当我发现我的choice类的一个属性写错了,应把pub_dat改为pub_date,我仅仅在pycharm上更改了,结果发现,migration中的数据库的属性并没有更改;出现这个问题的时候,要重新输入:
第二个问题:
Question.objects.get(某属性)如果返回值多于一个会报错
这个时候应该使用Question.objects.filter(某属性),filter会返回一个列表。
Django管理员的创建(自动创建)
1.创建超级管理员
$ python manage.py createsuperuser
2.进入网站(我觉得是)
$ python manage.py runserver
3.使得投票app能够被admin管理者更改:我们需要告诉管理员,Question对象有admin接口
网址:http://127.0.0.1:8000/polls/34/
每个view必须要做两件事的其中之一:返回HttpResponse包含了请求的内容,或者返回HTTP404;
其他的随便你。
逻辑:python难以编写页面设计->用django中template模板调用html->捷径:使用render()函数取代httpResponse->使用get_object_or_404()取代http404()[同时要使用render()进行回应]
有个问题:页面的设计在view.py中是很难编码的。
解决方法:创建Django模版,把设计从Python语言中分离出去
步骤1:创建/polls/templates目录(在/mysite/settings中可以看到调用方式)
创建/polls/templates/polls/index.html
重写polls/views.py中的index()函数:
使用模板(template)的捷径:运用render()模板能够引用模板,填充内容,返回HttpResponse:这样可以不import loader 和 httpresponse模块了。
引起404error
使用try:except并raise404的捷径:get_object_or_404()
使用此捷径的原因:这样会将模型层耦合到视图层,而django的设计最重要的原理就是松散地耦合(完全看不懂·····)
我的pycharm对html也没有自动补全啊哭,我的是教育邮箱的付费版呀····
注意对url地址,使用命名空间进行区分。
精简代码:
学一个词:radio button单选按钮
In short, all POST forms that are targeted at internal URLs should use the {% csrf_token %}
template tag.
接着:将程序改为能处理提交的数据的程序
reverse翻译就是“反转”的意思,反解析url以直接访问其它视图方法。
问题:会产生竞争现象;
解决方法:使用F()函数;
解释:F()函数表示了一个模块的某一栏的值,它使指向某一模块的某一字段值变为可能,在不是真的把这一字段的值从数据库中挖出来进行作用,而是对这个对象进行作用
精简代码:
现在就使用越少越好的原则精简代码了。
result()和detail()的代码都是差不多的。这代表了基本网页开发的普遍情况:根据url中的参数从数据库中提取数据,加载一个模板(html页面),返回一个规范的模板。因为它们如此相像,Django提供了一个捷径:the “generic views” system.
自动生成的管理员设置
django admin是django自己控制的,它的接口用的是自己的模板
python -c "import django; print(django.__path__)"
可以知道django的文件存储在哪里。
打包程序:
原理:一个python package包含许多modules。一个application就是一个package。我们发现只需要/polls目录下的内容
1. 创建polls的父目录django-polls;
2.把polls目录转移到django-polls目录下
3. 创建.rst文件
4. 创建django-polls/LICENSE文件(引用别人文件要有版权)
5. 创建setup.py文件
6.添加MANIFEST.in文件,包含原文件夹中没包括的内容(最好写doc文件解释并包含进去)
7.最后在命令行这个新建django-polls文件夹下运行:
python setup.py sdist
最后能得到打包程序