了解-Django

19次阅读

共计 18448 个字符,预计需要花费 47 分钟才能阅读完成。

装置

pip3 install Django

创立我的项目

django-admin.py startproject {项目名称}

如果提醒 `You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.` 请换个我的项目名, 不能和 py 模块雷同

如果提醒 Django 须要权限应用python manage.py migrate

启动我的项目

python manage.py runserver
or
python3 manage.py runserver 0.0.0.0:8000


》如果应用 sh 运行我的项目失败, 把我的项目目录权限凋谢
Permission denied
···
sudo chmod -R 777 {我的项目目录}
···

默认装置最新 release 版

pip3 install Django

装置开发版

git clone https://github.com/django/django.git
pip3 install -e django/

验证

在 py 下

import django
print(django.get_version())
//3.0.6

或终端下

python3 -m django --version

创立我的项目

django-admin startproject mysite

防止应用 Python 或 Django 的外部保留字来命名你的我的项目

我的项目构造

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • 根目录可随便更改, 不影响我的项目
  • manage.py: 一个让你用各种形式治理 Django 我的项目的命令行工具。你能够浏览 django-admin and manage.py 获取所有 manage.py 的细节。
  • 外面一层的 mysite/ 目录蕴含你的我的项目,它是一个纯 Python 包。它的名字就是当你援用它外部任何货色时须要用到的 Python 包名。(比方 mysite.urls).
  • mysite/__init__.py:一个空文件,通知 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,浏览官网文档中的 更多对于包的常识 ”)。
  • mysite/settings.py:Django 我的项目的配置文件。如果你想晓得这个文件是如何工作的,请查看 Django settings 理解细节。
  • mysite/urls.py:Django 我的项目的 URL 申明,就像你网站的“目录”。浏览 URL dispatcher 文档来获取更多对于 URL 的内容。
  • mysite/asgi.py:作为你的我的项目的运行在 ASGI 兼容的 Web 服务器上的入口。浏览 如何应用 WSGI 进行部署
    理解更多细节。
  • mysite/wsgi.py:作为你的我的项目的运行在 WSGI 兼容的 Web 服务器上的入口。浏览 如何应用如何应用 WSGI 进行部署 理解更多细节。

创立利用 投票

···
python3 manage.py startapp polls
···
···
polls/

__init__.py
admin.py
apps.py
migrations/
    __init__.py
models.py
tests.py
views.py

···

编写第一个视图

polls/views.py
···
from django.http import HttpResponse

def index(request):

return HttpResponse("Hello, world. You're at the polls index.")

···
polls/urls.py

from django.urls import path
from . import views

urlpatterns = [path('', views.index, name='index'),
]

mysite/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

运行服务器

···
python3 manage.py runserver
···
》默认 0.0.0.0:8000 雷同
如果运行时提醒·You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run ‘python manage.py migrate’ to apply them.· 应用·python3 manage.py migrate· 获取权限

···
python3 manage.py runserver 8080
python3 manage.py runserver 0:8000
···

主动从新加载的服务器

用于开发的服务器在须要的状况下会对每一次的拜访申请从新载入一遍 Python 代码。所以你不须要为了让批改的代码失效而频繁的重新启动服务器。然而,一些动作,比方增加新文件,将不会触发主动从新加载,这时你得本人手动重启服务器。

拜访网址

···
http://127.0.0.1:8000/polls/
···

api

path

函数 path() 具备四个参数,两个必须参数:routeview,两个可选参数:kwargsname。当初,是时候来钻研这些参数的含意了。

  • route 是一个匹配 URL 的准则(相似正则表达式)。当 Django 响应一个申请时,它会从 urlpatterns 的第一项开始,按程序顺次匹配列表中的项,直到找到匹配的项。这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在解决申请 https://www.example.com/myapp/ 时,它会尝试匹配 myapp/。解决申请 https://www.example.com/myapp… 时,也只会尝试匹配 myapp/。
  • view 当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕捉”的参数以关键字参数的模式传入。稍后,咱们会给出一个例子。
  • kwargs 任意个关键字参数能够作为一个字典传递给指标视图函数。本教程中不会应用这一个性。
  • name 为你的 URL 取名能使你在 Django 的任意中央惟一地援用它,尤其是在模板中。这个有用的个性容许你只改一个文件就能全局地批改某个 URL 模式。

当初,关上 mysite/settings.py。这是个蕴含了 Django 我的项目设置的 Python 模块。

通常,这个配置文件应用 SQLite 作为默认数据库。如果你不相熟数据库,或者只是想尝试下 Django,这是最简略的抉择。Python 内置 SQLite,所以你无需装置额定货色来应用它。当你开始一个真正的我的项目时,你可能更偏向应用一个更具扩展性的数据库,例如 PostgreSQL,防止中途切换数据库这个令人头疼的问题。

如果你想应用其余数据库,你须要装置适合的 database bindings,而后扭转设置文件中 DATABASES ‘default’ 我的项目中的一些键值:

  • ENGINE — 可选值有 ‘django.db.backends.sqlite3’,’django.db.backends.postgresql’,’django.db.backends.mysql’,或 ‘django.db.backends.oracle’。其它 可用后端。
  • NAME – 数据库的名称。如果应用的是 SQLite,数据库将是你电脑上的一个文件,在这种状况下,NAME 应该是此文件的绝对路径,包含文件名。默认值 os.path.join(BASE_DIR, ‘db.sqlite3’) 将会把数据库文件贮存在我的项目的根目录。

如果你不应用 SQLite,则必须增加一些额定设置,比方 USER、PASSWORD、HOST 等等。想理解更多数据库设置方面的内容,请看文档:DATABASES

SQLite 以外的其它数据库
如果你应用了 SQLite 以外的数据库,请确认在应用前曾经创立了数据库。你能够通过在你的数据库交互式命令行中应用 “CREATE DATABASE database_name;” 命令来实现这件事。
另外,还要确保该数据库用户中提供 mysite/settings.py 具备 “create database” 权限。这使得主动创立的 test database 能被当前的教程应用。
如果你应用 SQLite,那么你不须要在应用前做任何事——数据库会在须要的时候主动创立。

编辑 mysite/settings.py 文件前,先设置 TIME_ZONE 为你本人时区 (Asia/Shanghai)。
此外,关注一下文件头部的 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 设置文件和每个利用的数据库迁徙文件(咱们稍后会介绍这个)。这个命令所执行的每个迁徙操作都会在终端中显示进去。如果你感兴趣的话,运行你数据库的命令行工具,并输出 \dt (PostgreSQL),SHOW TABLES; (MariaDB,MySQL),.schema (SQLite)或者 SELECT TABLE_NAME FROM USER_TABLES; (Oracle) 来看看 Django 到底创立了哪些表。

就像之前说的,为了不便大多数我的项目,咱们默认激活了一些利用,但并不是每个人都须要它们。如果你不须要某个或某些利用,你能够在运行 migrate 前毫无顾虑地从 INSTALLED_APPS 里正文或者删除掉它们。migrate 命令只会为在 INSTALLED_APPS 里申明了的利用进行数据库迁徙。

创立模型

在 Django 里写一个数据库驱动的 Web 利用的第一步是定义模型 – 也就是数据库结构设计和附加的其它元数据。

模型是实在数据的简略明确的形容。它蕴含了贮存的数据所必要的字段和行为。Django 遵循 DRY Principle。它的指标是你只须要定义数据模型,而后其它的杂七杂八代码你都不必关怀,它们会主动从模型生成。
来介绍一下迁徙 – 举个例子,不像 Ruby On Rails,Django 的迁徙代码是由你的模型文件主动生成的,它实质上是个历史记录,Django 能够用它来进行数据库的滚动更新,通过这种形式使其可能和以后的模型匹配。

在这个投票利用中,须要创立两个模型:问题 Question 和选项 ChoiceQuestion 模型包含问题形容和公布工夫。Choice 模型有两个字段,选项形容和以后得票数。每个选项属于一个问题。

这些概念能够通过一个 Python 类来形容。依照上面的例子来编辑 polls/models.py 文件:

例子

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)

创立了两个 table, 两个之间还有关联

激活模型

下面的一小段用于创立模型的代码给了 Django 很多信息,通过这些信息,Django 能够:

  • 为这个利用创立数据库 schema(生成 CREATE TABLE 语句)。
  • 创立能够与 Question 和 Choice 对象进行交互的 Python 数据库 API。

然而首先得把 polls 利用装置到咱们的我的项目里。

为了在咱们的工程中蕴含这个利用,咱们须要在配置类 INSTALLED_APPS 中增加设置。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式门路是 ‘polls.apps.PollsConfig’。在文件 mysite/settings.py 中 INSTALLED_APPS 子项增加点式门路后,它看起来像这样:
mysite/settings.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig', // 增加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

配置利用

python3 manage.py makemigrations polls

你将会看到相似于上面这样的输入:

Migrations for ‘polls’:
polls/migrations/0001_initial.py

- Create model Question
- Create model Choice



Getting Help 

语言:zh-hans 

文档版本:3.0 

编写你的第一个 Django 利用,第 2 局部¶

这部分教程从 教程第 1 局部 结尾的中央持续讲起。咱们将建设数据库,创立您的第一个模型,并次要关注 Django 提供的主动生成的治理页面。

从哪里取得帮忙:

如果你在浏览本教程的过程中有任何疑难,能够返回 FAQ 的:doc:Getting Help</faq/help> 的版块。
数据库配置¶

当初,关上 mysite/settings.py。这是个蕴含了 Django 我的项目设置的 Python 模块。

通常,这个配置文件应用 SQLite 作为默认数据库。如果你不相熟数据库,或者只是想尝试下 Django,这是最简略的抉择。Python 内置 SQLite,所以你无需装置额定货色来应用它。当你开始一个真正的我的项目时,你可能更偏向应用一个更具扩展性的数据库,例如 PostgreSQL,防止中途切换数据库这个令人头疼的问题。

如果你想应用其余数据库,你须要装置适合的 database bindings,而后扭转设置文件中 DATABASES ‘default’ 我的项目中的一些键值:

ENGINE -- 可选值有 'django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或 'django.db.backends.oracle'。其它 可用后端。NAME - 数据库的名称。如果应用的是 SQLite,数据库将是你电脑上的一个文件,在这种状况下,NAME 应该是此文件的绝对路径,包含文件名。默认值 os.path.join(BASE_DIR, 'db.sqlite3') 将会把数据库文件贮存在我的项目的根目录。

如果你不应用 SQLite,则必须增加一些额定设置,比方 USER、PASSWORD、HOST 等等。想理解更多数据库设置方面的内容,请看文档:DATABASES。

SQLite 以外的其它数据库

如果你应用了 SQLite 以外的数据库,请确认在应用前曾经创立了数据库。你能够通过在你的数据库交互式命令行中应用 “CREATE DATABASE database_name;” 命令来实现这件事。

另外,还要确保该数据库用户中提供 mysite/settings.py 具备 “create database” 权限。这使得主动创立的 test database 能被当前的教程应用。

如果你应用 SQLite,那么你不须要在应用前做任何事——数据库会在须要的时候主动创立。

编辑 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 设置文件和每个利用的数据库迁徙文件(咱们稍后会介绍这个)。这个命令所执行的每个迁徙操作都会在终端中显示进去。如果你感兴趣的话,运行你数据库的命令行工具,并输出 dt (PostgreSQL),SHOW TABLES; (MariaDB,MySQL),.schema (SQLite)或者 SELECT TABLE_NAME FROM USER_TABLES; (Oracle) 来看看 Django 到底创立了哪些表。

写给极简主义者

就像之前说的,为了不便大多数我的项目,咱们默认激活了一些利用,但并不是每个人都须要它们。如果你不须要某个或某些利用,你能够在运行 migrate 前毫无顾虑地从 INSTALLED_APPS 里正文或者删除掉它们。migrate 命令只会为在 INSTALLED_APPS 里申明了的利用进行数据库迁徙。
创立模型¶

在 Django 里写一个数据库驱动的 Web 利用的第一步是定义模型 – 也就是数据库结构设计和附加的其它元数据。

设计哲学

模型是实在数据的简略明确的形容。它蕴含了贮存的数据所必要的字段和行为。Django 遵循 DRY Principle。它的指标是你只须要定义数据模型,而后其它的杂七杂八代码你都不必关怀,它们会主动从模型生成。

来介绍一下迁徙 – 举个例子,不像 Ruby On Rails,Django 的迁徙代码是由你的模型文件主动生成的,它实质上是个历史记录,Django 能够用它来进行数据库的滚动更新,通过这种形式使其可能和以后的模型匹配。

在这个投票利用中,须要创立两个模型:问题 Question 和选项 Choice。Question 模型包含问题形容和公布工夫。Choice 模型有两个字段,选项形容和以后得票数。每个选项属于一个问题。

这些概念能够通过一个 Python 类来形容。依照上面的例子来编辑 polls/models.py 文件:
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)也是字段名,所以最好应用对机器敌对的格局。你将会在 Python 代码里应用它们,而数据库会将它们作为列名。

你能够应用可选的选项来为 Field 定义一个人类可读的名字。这个性能在很多 Django 外部组成部分中都被应用了,而且作为文档的一部分。如果某个字段没有提供此名称,Django 将会应用对机器敌对的名称,也就是变量名。在下面的例子中,咱们只为 Question.pub_date 定义了对人类敌对的名字。对于模型内的其它字段,它们的机器敌对名也会被作为人类敌对名应用。

定义某些 Field 类实例须要参数。例如 CharField 须要一个 max_length 参数。这个参数的用途不止于用来定义数据库构造,也用于验证数据,咱们稍后将会看到这方面的内容。

Field 也可能接管多个可选参数;在下面的例子中:咱们将 votes 的 default 也就是默认值,设为 0。

留神在最初,咱们应用 ForeignKey 定义了一个关系。这将通知 Django,每个 Choice 对象都关联到一个 Question 对象。Django 反对所有罕用的数据库关系:多对一、多对多和一对一。
激活模型¶

下面的一小段用于创立模型的代码给了 Django 很多信息,通过这些信息,Django 能够:

为这个利用创立数据库 schema(生成 CREATE TABLE 语句)。创立能够与 Question 和 Choice 对象进行交互的 Python 数据库 API。

然而首先得把 polls 利用装置到咱们的我的项目里。

设计哲学

Django 利用是“可插拔”的。你能够在多个我的项目中应用同一个利用。除此之外,你还能够公布本人的利用,因为它们并不会被绑定到以后装置的 Django 上。

为了在咱们的工程中蕴含这个利用,咱们须要在配置类 INSTALLED_APPS 中增加设置。因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式门路是 ‘polls.apps.PollsConfig’。在文件 mysite/settings.py 中 INSTALLED_APPS 子项增加点式门路后,它看起来像这样:
mysite/settings.py

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

你将会看到相似于上面这样的输入:

Migrations for ‘polls’:
polls/migrations/0001_initial.py

- Create model Question
- Create model Choice

通过运行 makemigrations 命令,Django 会检测你对模型文件的批改(在这种状况下,你曾经获得了新的),并且把批改的局部贮存为一次 迁徙。

迁徙是 Django 对于模型定义(也就是你的数据库构造)的变动的贮存模式 – 它们其实也只是一些你磁盘上的文件。如果你想的话,你能够浏览一下你模型的迁徙数据,它被贮存在 polls/migrations/0001_initial.py 里。别放心,你不须要每次都浏览迁徙文件,然而它们被设计成人类可读的模式,这是为了便于你手动调整 Django 的批改形式。

Django 有一个主动执行数据库迁徙并同步治理你的数据库构造的命令 – 这个命令是 migrate,咱们马上就会接触它 – 然而首先,让咱们看看迁徙命令会执行哪些 SQL 语句。sqlmigrate 命令接管一个迁徙的名称,而后返回对应的 SQL:

查看 sql

python3 manage.py sqlmigrate polls 0001

请留神以下几点:

  • 输入的内容和你应用的数据库无关,下面的输入示例应用的是 PostgreSQL。
  • 数据库的表名是由利用名 (polls) 和模型名的小写模式 (question 和 choice) 连贯而来。(如果须要,你能够自定义此行为。)
  • 主键 (IDs) 会被主动创立。(当然,你也能够自定义。)
    默认的,Django 会在外键字段名后追加字符串 “_id”。(同样,这也能够自定义。)
    外键关系由 FOREIGN KEY 生成。你不必关怀 DEFERRABLE 局部,它只是通知 PostgreSQL,请在事务全都执行完之后再创立外键关系。
    生成的 SQL 语句是为你所用的数据库定制的,所以那些和数据库无关的字段类型,比方 auto_increment (MySQL)、serial (PostgreSQL)和 integer primary key autoincrement (SQLite),Django 会帮你主动解决。那些和引号相干的事件 – 例如,是应用单引号还是双引号 – 也一样会被主动解决。
    这个 sqlmigrate 命令并没有真正在你的数据库中的执行迁徙 – 相同,它只是把命令输入到屏幕上,让你看看 Django 认为须要执行哪些 SQL 语句。这在你想看看 Django 到底筹备做什么,或者当你是数据库管理员,须要写脚本来批量解决数据库时会很有用。

如果你感兴趣,你也能够试试运行 python manage.py check ; 这个命令帮忙你查看我的项目中的问题,并且在查看过程中不会对数据库进行任何操作。

python manage.py check

创立数据表

当初,再次运行 migrate 命令,在数据库里创立新定义的模型的数据表:

python manage.py migrate

这个 migrate 命令选中所有还没有执行过的迁徙(Django 通过在数据库中创立一个非凡的表 django_migrations 来跟踪执行过哪些迁徙)并利用在数据库上 – 也就是将你对模型的更改同步到数据库构造上。

迁徙是十分弱小的性能,它能让你在开发过程中继续的扭转数据库构造而不须要从新删除和创立表 – 它专一于使数据库平滑降级而不会失落数据。咱们会在前面的教程中更加深刻的学习这部分内容,当初,你只须要记住,扭转模型须要这三步:

编辑 models.py 文件,扭转模型。运行 python manage.py makemigrations 为模型的扭转生成迁徙文件。运行 python manage.py migrate 来利用数据库迁徙。

数据库迁徙被分解成生成和利用两个命令是为了让你可能在代码控制系统上提交迁徙数据并使其能在多个利用里应用;这不仅仅会让开发更加简略,也给别的开发者和生产环境中的应用带来不便。

通过浏览文档 Django 后盾文档,你能够取得对于 manage.py 工具的更多信息。

初试 API

python3 manage.py shell

咱们应用这个命令而不是简略的应用 “Python” 是因为 manage.py 会设置 DJANGO_SETTINGS_MODULE 环境变量,这个变量会让 Django 依据 mysite/settings.py 文件来设置 Python 包的导入门路。

当你胜利进入命令行后,来试试 database API 吧:
在终端中输出

援用模块
>from polls.models import Choice, Question
列出所有数据值(未录入, 是空的)
>Question.objects.all()
插入数据
>from django.utils import timezone
>q = Question(question_text="What's new?", pub_date=timezone.now())
保留这条数据
>q.save()
拜访这条数据
>q.id
>q.question_text
>q.pub_date
批改数据
>q.question_text = "What's up?"
>q.save()
再次检查数据
>Question.objects.all()
显示 `<QuerySet [<Question: Question object (1)>]>`
退出
>exit

给模块扩大自定义函数

polls/models.py
减少

给 Question 减少
def __str__(self):
        return self.question_text
给 Choice 减少
def __str__(self):
        return self.choice_text

这样再列举对象时, 间接显示对象的问题和抉择信息
保留后应用 shell 命令持续调试可失去 Question 的后果产生了变动
批改前

批改后

扩大工夫比拟性能

polls/models.py

减少两个援用
import datetime
from django.utils import timezone

减少一个函数, 检测是不是最近公布的
def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

进入 shell 命令调试

>from polls.models import Choice, Question
>Question.objects.all()
失去某项数据
>Question.objects.filter(id=1)
//
>from django.utils import timezone
失去以后年份
>current_year = timezone.now().year
检索往年录入的内容
>Question.objects.get(pub_date__year=current_year)
报错, 因为没有 id 为 2 的问题
>Question.objects.get(id=2) 
pk 为 primary key, 等同于 id
>Question.objects.get(pk=1)
>q = Question.objects.get(pk=1)
调用 api
>q.was_published_recently()
列出所有答案 (空)
>q.choice_set.all()
创立投票 1
>q.choice_set.create(choice_text='Not much', votes=0)  
创立投票 2
>q.choice_set.create(choice_text='The sky', votes=0)  
>c = q.choice_set.create(choice_text='Just hacking again', votes=0)
>c.question
>q.choice_set.all() 
取得所有投票条目数量
>q.choice_set.count()
列出所有往年问题的投票
>Choice.objects.filter(question__pub_date__year=current_year)
找到投票结尾为 Just 的选项
>c = q.choice_set.filter(choice_text__startswith='Just')
删除投票
>c.delete()

创立管理员

python3 manage.py createsuperuser

须要顺次输出 用户名 , 邮箱 , 明码

进入治理界面

启动服务器

python3 manage.py runserver

进入 http://127.0.0.1:8000/admin/ 页面

向治理页面中退出投票利用

polls/admin.py

from django.contrib import admin
from .models import Question

admin.site.register(Question)

注意事项:

  • 这个表单是从问题 Question 模型中主动生成的
  • 不同的字段类型(日期工夫字段 DateTimeField、字符字段 CharField)会生成对应的 HTML 输出控件。每个类型的字段都晓得它们该如何在治理页面里显示本人。
  • 每个日期工夫字段 DateTimeField 都有 JavaScript 写的快捷按钮。日期有转到明天(Today)的快捷按钮和一个弹出式日历界面。工夫有设为当初(Now)的快捷按钮和一个列出罕用工夫的不便的弹出式列表。

页面的底部提供了几个选项:

  • 保留(Save)– 保留扭转,而后返回对象列表。
  • 保留并持续编辑(Save and continue editing)– 保留扭转,而后从新载入以后对象的批改界面。
  • 保留并新增(Save and add another)– 保留扭转,而后增加一个新的空对象并载入批改界面。
  • 删除(Delete)– 显示一个确认删除页面。

雷同的办法, 能够把 Choice 表也显示进去

当删除一个问题时, 会连带这个问题的投票也一并删除

polls/views.py

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

polls.urls

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’ URLconf 做进一步解决。在这里残余文本匹配了 '<int:question_id>/',使得咱们 Django 以如下模式调用 detail():

detail(request=<HttpRequest object>, question_id=34)

question_id=34 由 <int:question_id> 匹配生成。应用尖括号“捕捉”这部分 URL,且以关键字参数的模式发送给视图函数。上述字符串的 :question_id> 局部定义了将被用于辨别匹配模式的变量名,而 int: 则是一个转换器决定了应该以什么变量类型匹配这部分的 URL 门路。

为每个 URL 加上不必要的货色,例如 .html,是没有必要的。不过如果你非要加的话,也是能够的:
path('polls/latest.html', views.index),
然而,别这样做,这太傻了。

实现性能

首页显示问题

from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ','.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)

这里有个问题:页面的设计写死在视图函数的代码里的。如果你想扭转页面的样子,你须要编辑 Python 代码。所以让咱们应用 Django 的模板零碎,只有创立一个视图,就能够将页面的设计从代码中分离出来。

模版

首先,在你的 polls 目录里创立一个 templates 目录。Django 将会在这个目录里查找模板文件。

你我的项目的 TEMPLATES 配置项形容了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS 设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 “templates” 子目录。这就是为什么只管咱们没有像在第二局部中那样批改 DIRS 设置,Django 也能正确找到 polls 的模板地位的起因。

在你刚刚创立的 templates 目录里,再创立一个目录 polls,而后在其中新建一个文件 index.html。换句话说,你的模板文件的门路应该是 polls/templates/polls/index.html。因为app_directories 模板加载器是通过上述形容的办法运行的,所以 Django 能够援用到 polls/index.html 这一模板了。

尽管咱们当初能够将模板文件间接放在 polls/templates 文件夹中(而不是再建设一个 polls 子文件夹),然而这样做不太好。Django 将会抉择第一个匹配的模板文件,如果你有一个模板文件正好和另一个利用中的某个模板文件重名,Django 没有方法 辨别 它们。咱们须要帮忙 Django 抉择正确的模板,最好的办法就是把他们放入各自的 命名空间 中,也就是把这些模板放入一个和 本身 利用重名的子文件夹里。

polls/templates/polls/index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

polls/views.py

from django.http import HttpResponse
from django.template import loader

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = {'latest_question_list': latest_question_list,}
    return HttpResponse(template.render(context, request))

templates文件夹名字肯定不要写错

其中

template = loader.get_template('polls/index.html')
    return HttpResponse(template.render(context, request))

可简化为

return render(request, 'polls/index.html', context)

抛出 404 谬误

polls/views.py

from django.http import Http404

def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

模版 polls/detail.html

{{question.id}}:{{question.question_text}}

一个快捷函数:get_object_or_404()

尝试用 get() 函数获取一个对象,如果不存在就抛出 Http404 谬误也是一个广泛的流程。Django 也提供了一个快捷函数,上面是批改后的详情 detail() 视图代码:
polls/views.py

from django.shortcuts import render, get_object_or_404

def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

也有 get_list_or_404() 函数,工作原理和 get_object_or_404() 一样,除了 get() 函数被换成了 filter() 函数。如果列表为空的话会抛出 Http404 异样。

应用模板零碎

模版 polls/detail.html

<h1>{{question.question_text}}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{choice.choice_text}}</li>
{% endfor %}
</ul>

联合 vue

你会发现 index 能配置进去, 然而 js 找不到,

  • 创立 django 我的项目
  • 创立 vue 我的项目在 manage.py 平级
  • 配置 vue 的公布规定, 将动态文件 assetsDir 都放到 static 下, (vue ui 能够间接界面上批改)
  • 批改 django 我的项目配置

    • settings.py下的 TEMPLATESDIRS要蕴含 vue 生成 index.html 目录, 也就是 DIRS:[‘vue/dist’],
    • 增加STATICFILES_DIRS 格局如下
STATICFILES_DIRS = [os.path.join(BASE_DIR, "vue/dist/static"),
]
  • 最初运行 django 我的项目

关键点在那两处文件地位设置, 如果 dirs 设置不正确, 会提醒模版找不到, 如果动态目录不是都蕴含在 static 下, js 会找不到 404

参考:
https://segmentfault.com/p/12…
https://ariera.github.io/2017…
http://cncc.bingj.com/cache.a…
http://cncc.bingj.com/cache.a…
https://blog.csdn.net/wjy397/…
http://www.3qphp.com/python/p…

正文完
 0