让我们开始Django文档教程中的投票案例吧。 可以在https://docs.djangoproject.com/zh-hans/4.2/intro/tutorial01/ 查看原教程。
我们将创建一个投票网站,
• 用户可以查看和投票 • 你可以管理投票内容。
如果你看过了上一篇Django快速入门,应该已经安装好了Django,我们开始吧。
这里我们简单回顾一下Django的一般流程,后面我们基本会按照视图(vies.py)--模型(models.py)--模板(xx.html)这三块来编写程序。
1. 创建项目
创建项目
创建项目: django-admin startproject mysite
这会创建一个名为mysit的文件夹,使用cd mysite 进入该文件夹。 运行项目: python manage.py runserver
服务器现在正在运行,通过浏览器访问 http://127.0.0.1:8000/ 可以看到默认的页面。
创建投票应用
在Django中,每一个应用(app)都是一个Python包。可以用Django帮助我们创建应用: python manage.py startapp polls
这将创建一个polls
目录,结构如下:
polls/ | |
__init__.py | |
admin.py | |
apps.py | |
migrations/ | |
__init__.py | |
models.py | |
tests.py | |
views.py | |
django帮我们搭好了架子,我们在此基础上实现自己的功能。
编写视图(views.py)
当用户打开网站的主页,我们想要显示"Hello, world. You're at the polls index."
这句话。具体的实现步骤如下:
1.编写视图,返回想要显示的页面。在polls/views.py
中,写入
from django.http import HttpResponse | |
def index(request): | |
return HttpResponse("Hello, world. You're at the polls index.") |
2.在polls/urls.py
中创建映射。用户打开网站的url时,Django能够调用views.index
函数返回响应。(如果polls下面没有urls.py可以新建一个)
from django.urls import path | |
from . import views | |
urlpatterns = [ | |
path("", views.index, name="index"), | |
] |
3.为了让polls/urls.py
在项目中生效,需要在根URL配置中添加。
在mysite/urls.py
的urlpatterns
列表中设置我们的polls
应用:
from django.contrib import admin | |
from django.urls import path,include | |
urlpatterns = [ | |
path("polls/", include("polls.urls")), | |
path("admin/", admin.site.urls), | |
] |
函数include()
允许引用其它 URLconfs。每当 Django 遇到include()
时,它会截断与此项匹配的 URL 的部分,并将剩余的字符串发送到 URLconf 以供进一步处理。
现在我们访问http://localhost:8000/polls/
,会看到"Hello, world. You're at the polls index."
,也就是我们在polls/views.py
的index
函数中定义的。
path()函数
函数path()
具有四个参数,两个必须参数:route
和 view
,两个可选参数:kwargs
和name
。 route
:route
是一个匹配URL的准则(类似正则表达式)。 当Django响应一个请求时,它会从urlpatterns
的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。这些准则会忽略GET
和POST
参数或域名。例如,URLconf
在处理请求 https://www.example.com/myapp/
时,它会尝试匹配myapp/
处理请求https://www.example.com/myapp/?page=3
时,也只会尝试匹配myapp/
。 view
:当 Django找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest
对象作为视图函数的第一个参数,被“捕获”的参数以关键字参数的形式传入。 kwargs
:任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。 name
:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
第2部分(模型)
我们将设置数据库,创建第一个模型,并快速介绍Django自带的后台界面。
数据库设置
打开 mysite/settings.py
,它包含了Django项目设置。Django默认使用SQLite
作为数据库。你不需要额外的设置就可以使用。如果你想使用其它数据库,请看DATABASES文档。
mysite/settings.py
文件中,我们可以设置一些东西,如将TIME_ZONE
改为当前时区。 INSTALLED_APPS
包括了会在你项目中启用的所有Django应用。
通常, INSTALLED_APPS 默认包括了以下 Django 的自带应用:django.contrib.admin -- 管理员站点 django.contrib.auth -- 认证授权系统 django.contrib.contenttypes -- 内容类型框架 django.contrib.sessions -- 会话框架 django.contrib.messages -- 消息框架 django.contrib.staticfiles -- 管理静态文件的框架 这些应用被默认启用是为了给常规项目提供方便。
默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令: python manage.py migrate
执行migrate命令会查看INSTALLED_APPS 配置,并根据mysite/settings.py文件中的数据库配置和随应用提供的数据库迁移文件(我们将在后面介绍这些),创建需要的数据库表。
创建模型
在这个投票应用中,需要创建两个模型来表示我们的数据:问题(Question)和选项(Choice)。Question
模型包括问题描述和发布时间。Choice
模型包括选项描述和当前得票数。每个选项属于一个问题。
我们在polls/models.py
中创建模型:
from django.db import models | |
class Question(models.Model): | |
question_text = models.CharField(max_length=200) | |
pub_date = models.DateTimeField("date published") | |
class Choice(models.Model): | |
question = models.ForeignKey(Question, on_delete=models.CASCADE) | |
choice_text = models.CharField(max_length=200) | |
votes = models.IntegerField(default=0) |
模型被表示为 django.db.models.Model
类的子类。每个模型有许多类变量,它们都表示模型里的一个数据库字段。每个字段都是Field
类的实例,比如,字符字段被表示为CharField
,日期时间字段被表示为DateTimeField
。这将告诉Django每个字段要处理的数据类型。每个Field
类实例变量的名字(例如 question_text
或pub_date
)也是字段名,所以最好不要有奇怪的字符。
你可以使用可选的选项来为Field
定义一个人类可读的名字。在上面的例子中,我们只为 Question.pub_date
定义了对人类友好的名字date published
。
定义某些Field
类实例需要参数。例如 CharField
需要一个max_length
参数。这个参数的用处不止于用来定义数据库结构,也用于验证数据,我们稍后将会看到这方面的内容。
Field
也能够接收多个可选参数。在上面的例子中我们将votes
的default
值设为0。
注意在Choice
模型中,我们使用ForeignKey
定义了一个关系。这将告诉Django,每个Choice
对象都关联到一个 Question
对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一。
激活模型
为了在我们的工程中包含这个应用,我们需要在配置类INSTALLED_APPS
中添加设置。因为PollsConfig
类写在文件polls/apps.py
中,所以它的点式路径是polls.apps.PollsConfig
。在文件mysite/settings.py
中INSTALLED_APPS
子项添加该路径:
INSTALLED_APPS = [ | |
"polls.apps.PollsConfig", | |
"django.contrib.admin", | |
"django.contrib.auth", | |
"django.contrib.contenttypes", | |
"django.contrib.sessions", | |
"django.contrib.messages", | |
"django.contrib.staticfiles", | |
] |
现在你的Django项目会包含polls
应用。接着运行下面的命令 python manage.py makemigrations polls
运行makemigrations
命令后,Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 它们其实也只是一些你磁盘上的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在 polls/migrations/0001_initial.py 里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便于你手动调整 Django 的修改方式。
Django有一个自动执行数据库迁移并同步管理你的数据库结构的命令 migrate
,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL: python manage.py sqlmigrate polls 0001
你会看到一些创建表的语句。
现在我们运行migrate
命令,在数据库里创建新定义的模型的数据表: python manage.py migrate
迁移是非常强大的功能,它能让你在开发过程中持续地改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:
- 1. 编辑 models.py 文件,创建/改变模型。
- 2. 运行
python manage.py makemigrations
为模型的改变生成迁移文件。 - 3. 运行
python manage.py migrate
来应用数据库迁移。
初试 API
现在让我们进入交互式 Python 命令行,使用Django的API: python manage.py shell
运行后会进入Django的shell
模式,可以执行Django命令,例如下面我们可以浏览数据库。
from polls.models import Choice, Question | |
all() | Question.objects.|
<QuerySet []> | |
# Create a new Question. | |
from django.utils import timezone | |
"What's new?", pub_date=timezone.now()) | q = Question(question_text=|
# Save the object into the database. You have to call save() explicitly. | |
q.save() | |
id | q.|
1 | |
# Access model field values via Python attributes. | |
q.question_text | |
"What's new?" | |
q.pub_date | |
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc) | |
# Change values by changing the attributes, then calling save(). | |
"What's up?" | q.question_text =|
q.save() | |
# objects.all() displays all the questions in the database. | |
all() | Question.objects.|
<QuerySet [<Question: Question object (1)>]> |
管理员页面
创建一个管理员账号
python manage.py createsuperuser
然后按照提示,输入用户名,邮件,密码,重复密码。(如果密码太简单,会提示你是否使用该密码,输入y)
进入管理员页面
启动服务器 python manage.py runserver
然后进入http://127.0.0.1:8000/admin
,会看到管理员登录界面。因为翻译功能默认是开启的,如果你设置了 LANGUAGE_CODE
,登录界面将显示你设置的语言(如果Django有相应的翻译)。
用刚刚创建的管理员账号登录,会进入管理员页面。你会看到Group
和Users
两个内容,这是Djang默认提供的用于用户认证的数据。
为了能看到我们自己的内容,需要向管理站点注册(register)。在polls/admin.py
中写入:
from django.contrib import admin | |
from .models import Question | |
admin.site.register(Question) |
这样管理站点就知道Question
的存在了。刷新后可以看到。后面我们就可以对其进行编辑了。
类似地,注册Choice,以便我们能在后台添加选项。
from django.contrib import admin | |
from .models import Question,Choice | |
admin.site.register(Question) | |
admin.site.register(Choice) |