最近重新读了一下文档,记录一些我觉得重要的点,之后能在较短时间把握大致框架
目录
搭建环境
Django:1.11
Python环境与Django版本对应表:
Django version | Python versions |
1.8 | 2.7, 3.2 (until the end of 2016), 3.3, 3.4, 3.5 |
1.9, 1.10 | 2.7, 3.4, 3.5 |
1.11 | 2.7, 3.4, 3.5, 3.6 |
2.0 | 3.4, 3.5, 3.6 |
2.1 | 3.5, 3.6, 3.7 |
选择py为3.6,在anaconda中创建虚拟环境
Anaconda默认的django版本为2.5
尝试安装对应版本django
cd D:\anacondaProject\project3 |
conda install Django==1.11.8 #安装django anaconda中没有1.11.4只有1.11.8 |
python >>> import django >>> print(django.get_version()) |
在setting.py中修改数据库配置,创建对应数据库
pymysql |
删除迁移文件(migrations文件夹下的所有)
生成数据库迁移文件
python manage.py makemigrations |
执行迁移
python manage.py migrate |
启动服务
python manage.py runserver |
打开网页
http://127.0.0.1:8000/verifycodefile/ |
报错:
ModuleNotFoundError: No module named 'PIL' |
因为需要pillow模块
pip install Pillow |
查看官网教程:
第一节
https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial01/
其中介绍要点:
1.你刚刚启动的是Django自带的用于开发的简易服务器,它是一个用纯Python写的轻量级的Web服务器。我们将这个服务器内置在Django中是为了让你能快速的开发出想要的东西,因为你不需要进行配置生产等级的服务器(例如Apache)方面的工作,除非你已经准备好引入生产环境了。
现在是一个提醒你的好时机:千万不要将这个服务器用作和生产环境相关的任何地方。这个服务器只是为了开发而设计的。(我们在Web框架方面是专家,在Web服务器方面并不是。)
修改代码会自动重新加载的服务器,添加文件不会
你的应用可以存放在任何Python的路径中定义的路径。在这个教程中,将我们在你的manage.py同级目录下创建投票应用。这样它就可以作为顶级模块导入,不是而mysite的子模块。
请确定你现在位于其中manage.py的目录下,然后运行这行命令来创建一个应用:
$ python manage.py startapp polls
2. mysite/urls.py文件中可以通过include引入其他app模块的url conf
第二节
https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/
介绍model对应数据表:
定义某些Field 类实例需要参数。例如CharField 需要一个max_length 参数。这个参数的用处不止于使用定义的数据库结构,也用于验证数据,我们以后将会看到这方面的内容。
为了在我们的工程中包含这个应用,需要我们在配置类INSTALLED_APPS中添加设置。因为PollsConfig类写在文件polls/apps.py中,所以它的点式路径是'polls.apps.PollsConfig',文件在mysite/settings.py中INSTALLED_APPS子项添加点式路径
现在你的 Django 项目会包含 polls 应用。接着运行下面的命令:
$ python manage.py makemigrations polls
你将会看到类似于下面这样的输出:
Migrations for 'polls':
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
默认的,Django会在外键分区名后追加字符串"_id"。(同样,这也可以自定义。)
迁移是非常强大的功能,它可以使您在开发过程中持续的改变数据库结构而不需要重新删除和创建表-它专注于使数据库平滑升级而不会丢失数据。深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:
- 编辑models.py文件,改变模型。
- 运行 为模型的改变生成迁移文件。python manage.py makemigrations
- 运行 来应用数据库迁移。python manage.py migrate
创建一个管理员账号¶
首先,我们得创建一个能登录管理页面的用户。请运行下面的命令:
/
$ python manage.py createsuperuser
键入你想要使用的用户名,然后点击回车键:
Username: admin
然后提示你输入想要使用的邮件地址:
Email address: admin@example.com
最后一步是输入密码。你会被要求输入两次密码,第二次的目的是为了确认第一次输入的确实是你想要的密码。
Password: **********p@ssw0rd
Password (again): *********
Superuser created successfully.
启动开发服务器¶
Django的管理界面默认就是启用的。让我们启动开发服务器,看看它到底是什么样的。
如果开发服务器未启动,用以下命令启动它:
$
activate django_test cd /d D:\anacondaProject\project3 python manage.py runserver |
现在,打开浏览器,转到您本地域名的“ / admin /”目录,-例如“ http://127.0.0.1:8000/admin/ ”。您应该会看到管理员登录界面
需要告诉管理员Question对象具有管理界面。为此,请打开polls/admin.py文件,然后
from django.contrib import admin
from .models import Question
admin.site.register(Question) |
第三节
https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial03/
把这些新视图添加进polls.urls 模块里,只要添加url() 几个函数调用就行:
民调/的urls.py ¶
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
然后看看你的浏览器,如果你转到“ / polls / 34 /”,Django将会运行detail()方法并展示你在URL里提供的问题ID。再试试“ / polls / 34 / vote /”和“ / polls / 34 / vote /“-你将会看到暂时使用占位的结果和投票页。
当某人请求您网站的某个页面时-有时说,“ / polls / 34 /”,Django将会加载mysite.urls模块,因为这在配置项ROOT_URLCONF中设置了。然后Django寻找命名urlpatterns变量和按序匹配正则表达式在找到匹配项。'polls/',它切掉了匹配的文本("polls/"),将剩余文本- "34/"。,发送至'polls.urls' URL配置做进一步处理在这里剩余文本匹配了'<int:question_id>/
question_id=34由<int:question_id>匹配生成。使用尖括号“捕获”这部分URL,并以关键字参数的形式发送给视图函数。上述字符串的:question_id>部分定义了将被用作区分匹配模式的变量名,而int:则是一个转换器决定了应该以什么变量类型匹配这部分的URL路径。
第四节
表单处理https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial04/
当编写一个Django应用时,你应该先评估一下通用视图是否可以解决你的问题,你应该在一开始使用它,而不是进行到一半时插入代码。
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
字符串路径中匹配模式的名称已经由<question_id>对划线<pk>。
我们在这里使用两个通用视图:ListView和DetailView。这两个视图分别抽象“显示一个对象列表”和“显示一个特定类型对象的详细信息页面”这两种概念。
第五节
测试https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial05/
以下是自动化测试的运行过程:
- python manage.py test polls 将会寻找 polls 应用里的测试代码
- 它找到了 django.test.TestCase 的一个子类
- 它创建一个特殊的数据库供测试使用
- 它在类中寻找测试方法——以 test 开头的方法。
- 在 test_was_published_recently_with_future_question 方法中,它创建了一个 pub_date 值为 30 天后的 Question 实例。
- 接着使用 assertls() 方法,发现 was_published_recently() 返回了 True,而我们期望它返回 False。
第六节
样式和图片
在static您刚创建的目录中,创建另一个目录polls,在其中创建一个名为的文件style.css。换句话说,您的样式表应位于polls/static/polls/style.css。由于AppDirectoriesFinderstaticfile finder的工作方式,您可以在Django中将该静态文件称为polls/style.css,类似于引用模板路径的方式。
下一步,在polls/templates/polls/index.html的文件头添加以下内容:
民调/模板/调查/ index.html的¶
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}">
{%
static
%} 模板标签会生成静态文件的绝对路径。
第七节
后台https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial07/
Admin.py
from django.contrib import admin from .models import Choice, Question admin.site.register(Choice) |
在这个表单中,"Question" 字段是一个包含数据库中所有投票的选择框。Django 知道要将 ForeignKey 在后台中以选择框 <select> 的形式展示。此时,我们只有一个投票。
同时也注意下 "Question" 旁边的“添加”按钮。每个使用 ForeignKey 关联到另一个对象的对象会自动获得这个功能。当你点击“添加”按钮时,你会见到一个包含“添加投票”的表单。如果你在这个弹出框中添加了一个投票,并点击了“保存”,Django 会将其保存至数据库,并动态地在你正在查看的“添加选项”表单中选中它。(低效,把所有的列出来一起添加更好)
from django.contrib import admin from .models import Choice, Question class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin) |
这会告诉 Django:“Choice 对象要在 Question 后台页面编辑。默认提供 3 个足够的选项字段。”
它看起来像这样:有三个关联的选项插槽——由 extra 定义,且每次你返回任意已创建的对象的“修改”页面时,你会见到三个新的插槽。
在三个插槽的末端,你会看到一个“添加新选项”的按钮。如果你单击它,一个新的插槽会被添加。如果你想移除已有的插槽,可以点击插槽右上角的X。注意,你不能移除原始的 3 个插槽。
但这仍然占太大空间,可用tabular
class ChoiceInline(admin.TabularInline): |
通过 TabularInline``(替代
``StackedInline ),关联对象以一种表格式的方式展示,显得更加紧凑(上下布局改左右布局)
注意这里有一个额外的“删除?”列,这允许移除通过“添加新选项”按钮添加的,或是已被保存的行。
默认情况下,Django 显示每个对象的 str() 返回的值。但有时如果我们能够显示单个字段,它会更有帮助。为此,使用 list_display 后台选项,它是一个包含要显示的字段名的元组,在更改列表页中以列的形式展示这个对象:
list_display = ('question_text', 'pub_date', 'was_published_recently')
你可以点击列标题来对这些行进行排序——除了 was_published_recently 这个列,因为没有实现排序方法。顺便看下这个列的标题 was_published_recently,默认就是方法名(用空格替换下划线),该列的每行都以字符串形式展示出处。
可以通过给这个方法(在 polls/models.py 中)一些属性来改变展示标题
再次编辑文件 polls/admin.py,优化 Question 变更页:过滤器,使用 list_filter。将以下代码添加至 QuestionAdmin:
list_filter = ['pub_date']
这样做添加了一个“过滤器”侧边栏,允许人们以 pub_date 字段来过滤列表:
search_fields = ['question_text']
在列表的顶部增加一个搜索框。当输入待搜项时,Django 将搜索 question_text 字段。你可以使用任意多的字段——由于后台使用 LIKE 来查询数据,将待搜索的字段数限制为一个不会出问题大小,会便于数据库进行查询操作。
自定义后台界面和风格¶
在每个后台页顶部显示“Django 管理员”显得很滑稽。这只是一串占位文本。
打开你的设置文件(mysite/settings.py,牢记),在 TEMPLATES 设置中添加 DIRS 选项:
mysite/settings.py¶
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DIRS 是一个包含多个系统目录的文件列表,用于在载入 Django 模板时使用,是一个待搜索路径。
现在,在 templates 目录内创建名为 admin 的目录,随后,将存放 Django 默认模板的目录(django/contrib/admin/templates)内的模板文件 admin/base_site.html 复制到这个目录内。
Then, edit the file and replace {{
site_header|default:_('Django
administration')
}} (including the curly braces) with your own site's name as you see fit. You should end up with a section of code like:
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
(覆写模板)
后台主页需要自定义的模板是 admin/index.html。(像上一节修改 admin/base_site.html 那样修改此文件——从默认目录中拷贝此文件至自定义模板目录)。打开此文件,你将看到它使用了一个叫做 app_list 的模板变量。这个变量包含了每个安装的 Django 应用。你可以用任何你期望的硬编码链接(链接至特定对象的管理页)替代使用这个变量。