11.Django2.0文档

作者: 网络编程  发布:2019-07-12

第四章 模板

5.赢得单个对象

上面包车型地铁事例中`` filter()`` 函数再次回到多少个记录集,那几个记录集是三个列表。 相对列表来讲,某个时候大家更亟待得到单个的靶子, `` get()`` 方法就是在那时候应用的:

 图片 1

那般,就回到了单个对象,并非列表(校对确的说,QuerySet)。 所以,假设结果是三个目的,会导致抛出特别:

 图片 2

假若查询未有回到结果也会抛出十一分:

 1.标签

(1)if/else

{% if %} 标签检查(evaluate)二个变量,假如这几个变量为真(即,变量存在,非空,不是布尔值假),系统会
来得在 {% if %} 和 {% endif %} 之间的其他内容,举个例子:

{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% endif %}

{% else %} 标签是可选的:

{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% else %}
<p>Get back to work.</p>
{% endif %}

{% if %} 标签接受 and , or 可能 not 关键字来对三个变量做决断,可能对变量取反( not )

(2)for

{% for %} 允许我们在一个体系上迭代。 与Python的 for 语句的图景类似,循环语法是 for X in Y ,Y是要迭代的连串而X是在每三个特定的巡回中采纳的变量名称。 每三遍巡回中,模板系统会渲染在 {% for %} 和
{% endfor %} 之间的享有内容。

举例,给定一个运动员列表 athlete_list 变量,大家得以应用上边包车型客车代码来体现那个列表:

<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>

给标签扩大三个 reversed 使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

能够嵌套使用 {% for %} 标签:

{% for athlete in athlete_list %}
<h1>{{ athlete.name }}</h1>
<ul>
{% for sport in athlete.sports_played %}
<li>{{ sport }}</li>
{% endfor %}
</ul>
{% endfor %}

Django不扶助退出循环操作。 如果大家想退出循环,能够改动正在迭代的变量,让其单独包涵需求迭代的品种。 同理,Django也不帮忙continue语句,大家心余力绌让这两天迭代操作跳回到循环底部。

在每个`` {% for %}``巡回里有贰个叫作`` forloop`` 的模板变量。这一个变量有一对唤起循环速度消息的品质。

forloop.counter 总是一个象征近来巡回的举办次数的大背头计数器。 这么些计数器是从1上马的,所以在率先次循环时 forloop.counter 将会被设置为1。

例子:

def lists(request):
    lists = [1,2,3,4,5]
    return render(request,"lists.html",{'lists':lists})

 {% for item in lists %}
        <p>{{ forloop.counter }}:{{ item }}</p>
    {% endfor %}

结果:

1:1

2:2

3:3

4:4

5:5

-->>forloop.counter0 类似于 forloop.counter ,不过它是从0计数的。 第一遍实施循环时这些变量会棉被服装置为0。

-->>forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为甘休索引。 在首先次实行循环时,该变量会被置为系列的项的个数减1

forloop.first 是多个布尔值,假如该迭代是率先次试行,那么它被置为````

 {% for item in lists %}
        {% if forloop.first %}
            <li style="color: red">{{ forloop.counter }}:{{ item }}</li>
        {% else %}
            <li>{{ forloop.counter }}:{{ item }}</li>
        {% endif %}

    {% endfor %}

结果:

图片 3

forloop.last 是一个布尔值;在结尾三回实行循环时被置为True。

forloop.parentloop 是贰个针对性当前巡回的上拔尖循环的 forloop 对象的引用(在嵌套循环的情事下)。

2.Admin干活原理

当服务运转时,Django从`` url.py`` 指引U本田UR-VLconf,然后施行`` admin.autodiscover()`` 语句。 这么些函数遍历INSTALLED_应用软件S配置,而且搜索有关的admin.py文件。 如果在钦命的app目录下找到admin.py,它就推行个中的代码。 在`` book`` 应用程序目录下的`` admin.py`` 文件中,每一遍调用`` admin.site.register()`` 都将不胜模块注册到处理工科具中。 管理工科具只为那多少个分明登记了的模块呈现二个编纂/修改的分界面。应用程序`` django.contrib.auth`` 富含小编的`` admin.py`` ,所以Users和Groups能在管理工科具中机动彰显。别的的django.contrib应用程序,如django.contrib.redirects,另外从互连网下在的第三方Django应用程序同样,都会自行增多到管理工具。

5.模板承袭

 (1)定义基础模板base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
        <hr>
        <p>Thanks for visiting my site</p>
    {% endblock %}
</body>
</html>

本条叫做 base.html 的模版定义了二个总结的 HTML 框架文书档案,我们就要具备页面中应用。 子模板的效果便是重载、增添或保留那多少个块的开始和结果。
有着的 {% block %} 标签告诉模板引擎,子模板能够重载这个某些。 每一个 {% block %} 标签所要做的是报告模板引擎,该模板下的这一块内容将有希望被子模板覆盖。

(2)子模板current_time.html

{% extends 'base.html' %}

{% block title %}The current time{% endblock%}

{% block content %}
    <p>It is now {{ current_date }}</p>
{% endblock %}

(3)views.py

from django.shortcuts import HttpResponse,render

import datetime


def current_datetime(request):
    current_date = datetime.datetime.now()
    return render(request,'cuttent_datetime.html',{'current_date':current_date})

       以下是其行事方式:在加载 current_datetime.html 模板时,模板引擎开掘了 {% extends %} 标签,模板引擎马上装载其父模板,即本例中的 base.html 。此时,模板引擎注意到 base.html 中的八个 {% block %} 标签,并用子模板的源委替换那一个 block 。由此,引擎将会动用我们在 { block title %} 中定义的标题,对 {% block content %} 也是那样。 所以,网页标题一块将由 {% block title %} 替换,同样地,网页的内容一块将由 {% block content %} 替换。注意由于子模板并不曾定义 footer 块,模板系统将运用在父模板中定义的值。 父模板 {% block %} 标签中的内容总是被作为一条退路。承袭并不会潜濡默化到模板的上下文。 换句话说,任何处在承继树上的模板都能够访谈到你传到模板中的每三个模板变量。

图片 4图片 5

如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作
用。
一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因
此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话
说,钩子越多越好。
如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。
如果你需要访问父模板中的块的内容,使用 {{ block.super }} 这个标签吧,这一个魔法变量将会表现出
父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双
向的。 也就是说,block 标签不仅挖了一个要填的坑,也定义了在 父 模板中这个坑所填充的内容。如果模
板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。
{% extends %} 对所传入模板名称使用的加载方法和 get_template() 相同。 也就是说,会将模板名称被添
加到 TEMPLATE_DIRS 设置之后。
多数情况下, {% extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也
可以是个变量。 这使得你能够实现一些很酷的动态功能。

模板承袭的有的要诀

3.过滤器

模板过滤器是在变量被出示前修改它的值的一个简短方法。 过滤器使用管道字符,

{{ name|lower }}    #它功能是转换文本为小写。

过滤管道能够被* 套接* ,既是说,二个过滤器管道的输出又足以看作下叁个管道的输入,如此下来

{{ my_list|first|upper }}   #查找列表的第一个元素并将其转化为大写。

 4.自定义字段标签    

 在编写制定页面中,每个字段的价签都以从模块的字段名称更动的。准绳比不会细小略: 用空格替换下划线;首字母大写

但是,字段名称并不一而再贴切的。有个别情况下,你大概想自定义二个标签。 你只需在模块中内定verbose_name。

 举个例证,表明怎么样将Author.email的价签改为e-mail,中间有个横线。

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(null=True,blank=True,verbose_name='e-mail')

改之前

图片 6

改之后

图片 7

 2.安装数据库为Mysql

 在settings里面修改配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',        #数据库名字
        'USER': 'root',          #账号
        'PASSWORD': '123456',      #密码
        'HOST': '127.0.0.1',    #IP
        'PORT': '3306',                   #端口
    }
}

在app的init.py里面导入pymysql模块

import pymysql
pymysql.install_as_MySQLdb()

设置好后张开 python manage.py shell 来进展测验。输入一下命令,若无报错表明,表达数据库配置是正确的

>>> from django.db import connection
>>> cursor = connection.cursor()

 3.设置字段可选

 你可能会意识处理工科具备个限制:编辑表单必要你填写每一个字段,然则在多少处境下,你想要有个别字段是可选的。 比如,大家想要Author模块中的email字段成为可选,即允许不填。 在具体世界中,你只怕未有为各样我登记邮箱地址。

为了钦命email字段为可选,你一旦编辑Book模块

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(null=True,blank=True)

这么些代码告诉Django,小编的邮箱地址允许输入一个空值

 3.设置字段可选

 你或许会意识处理工科具备个限制:编辑表单供给你填写每多个字段,但是在有一些景况下,你想要某个字段是可选的。 举例,我们想要Author模块中的email字段成为可选,即允许不填。 在切切实实世界中,你只怕未有为各样小编登记邮箱地址。

为了钦点email字段为可选,你如若编辑Book模块:

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(null=True,blank=True)

这个代码告诉Django,作者的邮箱地址允许输入一个空值

 1.MTV and MVC

把多少存取逻辑、业务逻辑和显现逻辑组合在协同的定义临时被叫做软件架构的Model-View-Controller(MVC)情势。 在那些情势中, Model 代表数量存取层,View 代表的是系统中选用呈现怎么和怎么显得的有个别,Controller 指的是系统中依据用户输入并视需求拜谒模型,以决定接纳哪个视图的那有些。

     M:数据存取部分,由django数据库层处理,本章要呈报的剧情。

  V:采用显示怎么数据要显得以及哪些突显的片段,由视图和模板管理。

  C:依据用户输入委派视图的部分,由 Django 框架根据 UEscortLconf 设置,对给定 UXC60L 调用适当的Python 函数

 由于 C 由框架自行管理,而 Django 里更保养的是模型(Model)、模板(Template)和视图(Views),Django 也被誉为M电视 框架。在 MTV 开垦情势中:

   M:代表模型(Model),即数据存取层。 该层管理与数码有关的保有事务: 怎样存取、如何评释有效性、包蕴哪些表现以及数据里面包车型地铁涉嫌等

   T:代表模板(Template),即表现层。 该层管理与表现成关的决定: 怎么样在页面或别的项目文书档案中开始展览突显。

  V:代表视图(View),即职业逻辑层。 该层饱含存取模型及调取安妥模板的有关逻辑。 你能够把它看作模型与模板之间的大桥。

 6.数据排序

在运作前边的事例中,你大概已经注意到再次来到的结果是冬天的。 我们还并未有告知数据库 如何对结果举办排序,所以大家回到的结果是严节的。 在您的 Django 应用中,你只怕希望依据某字段的值对寻找结果排序,譬喻说,按字母逐个。 那么,使用order_by()这几个艺术就能够化解了。

图片 8

我们能够对轻松字段张开排序,假诺急需以四个字段为标准开始展览排序(第贰个字段会在率先个字段的值一样的情况下被采用到),使用多个参数就可以了,如下:

图片 9

我们还足以内定逆向排序,在前面加二个减号‐前缀: 图片 10

限制再次来到的数目

图片 11

2.Admin行事规律

当服务运行时,Django从`` url.py`` 教导U奥迪Q5Lconf,然后实行`` admin.autodiscover()`` 语句。 这一个函数遍历INSTALLED_APPS配置,何况搜索有关的admin.py文件。 假使在钦命的app目录下找到admin.py,它就推行在那之中的代码。

在`` book`` 应用程序目录下的`` admin.py`` 文件中,每一遍调用`` admin.site.register()`` 都将特别模块注册到管理工科具中。 管理工科具只为这个显著登记了的模块展现多少个编纂/修改的分界面。应用程序`` django.contrib.auth`` 包罗小编的`` admin.py`` ,所以Users和Groups能在管理工科具中自动彰显。别的的django.contrib应用程序,如django.contrib.redirects,另外从互连网下在的第三方Django应用程序同样,都会自行增加到管理工科具。

3.率先个模型

书籍/作者/出版商 数据库

   三个作者有姓,有名及email地址。

  出版商盛名称,地址,所在城市、省,国家,网址。   书籍有书名和出版日期。 它有二个或八个小编(和小编是多对多的关系关系[many-to-many]), 独有一个出版商(和出版商是一对多的关系关系[one-to-many],也被称作外          键[foreign key])

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    publication_date = models.DateField()
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher,on_delete = models.CASCADE)

打开shell,添加publisher

图片 12

当大家打字与印刷整个publisher列表时,我们并未有博得想要的有用音信,只须要为Publisher对象增加二个__str__方法 ,就足以对Publisher对象更便于了解

图片 13from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() def __str__(self): return self.name class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() def __str__(self): return '%s%s'%(self.first_name,self.last_name) class Book(models.Model): title = models.CharField(max_length=100) publication_date = models.DateField() authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher,on_delete = models.CASCADE) def __str__(self): return self.title 添加__str__方法

图片 14

5.收获单个对象

地方的例证中`` filter()`` 函数再次回到二个记录集,这几个记录集是三个列表。 绝对列表来讲,某个时候我们更供给获得单个的指标, `` get()`` 方法就是在此时利用的:

 图片 15

像这种类型,就重返了单个对象,实际不是列表(更确切的说,QuerySet)。 所以,如若结果是八个对象,会招致抛出分外:

 图片 16

要是查询未有再次来到结果也会抛出非常:

 4.自定义字段标签    

 在编写页面中,各种字段的价签都以从模块的字段名称更改的。准绳非常粗大略: 用空格替换下划线;首字母大写

然则,字段名称并不总是贴切的。有些情状下,你恐怕想自定义多个标签。 你只需在模块中内定verbose_name。

 举个例证,说明怎样将Author.email的标签改为e-mail,中间有个横线。

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField(null=True,blank=True,verbose_name='e-mail')

改之前

图片 17

改之后

图片 18

5.自定义ModelAdmi类

 迄今截至,大家做的blank=True、null=True和verbose_name修改其实是模块品级,实际不是治本品级的。 也便是说,那个改动实质上是组成模块的一有的,何况刚刚被处理工具使用,并非特意针对处理工科具的。

除却这个,Django还提供了大批量挑选让你针对特地的模块自定义管理工科具。 那么些选用都在ModelAdminclasses里面,那么些类蕴含了管理工科具中针对特意模块的配置。

 (1)自定义列表

 暗中认可意况下,Author上边只显示每一个作者的全名

图片 19

大家得以在这基础上改正,加多其余字段,从而改造列表的体现。例如说:在这几个列表中得以见见我的邮箱地址,为了到达这一个目标,大家将为Author模块定义多个ModelAdmin类。 那些类是自定义管理工科具的要紧,当中最中央的一件业务是同意你钦点列表中的字段。

 修改admin.py

from django.contrib import admin
from book import models

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name','last_name','email')

admin.site.register(models.Author,AuthorAdmin)
admin.site.register(models.Book)
admin.site.register(models.Publisher)

可以见见如下效果

图片 20

解释一下代码:

咱们新建了贰个类AuthorAdmin,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着三个类的自定义配置,以供管理工科具使用。大家只自定义了一项:list_display,它是一个字段名称的元组,用于列表呈现。当然,这个字段名称必须是模块中部分。

咱俩修改了admin.site.register()调用,在Author后边增添了AuthorAdmin。你能够这么精通:用AuthorAdmin选项注册Author模块。

(2)增加火速查询栏

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name','last_name','email')
    search_fields = ('first_name','last_name')

在页面最上部看到多个查询栏

图片 21

(3)加多过滤器

接下去,让大家为Book列表页加多一些过滤器。

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)

admin.site.register(models.Author,AuthorAdmin)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

能够见到左边有filter,Django为日期型字段提供了快捷过滤方式,它包罗:前几日、过往一周、上月和当年

图片 22

其它一种过滤日期的不二等秘书籍是选用date_hierarchy选项,如:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'

修改好后,页面中的列表最上端会有叁个逐层深切的导航条,效果如下. 它从可用的年度起先,然后逐层细分到月以致日。

图片 23

请注意,date_hierarchy接受的是* 字符串* ,并不是元组。因为只好对贰个日期型字段实行档案的次序划分。

 (4)降序排列

让大家改动默许的排序方式,按publication date降序排列。

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)

 (5)自定义编辑表单

 正如自定义列表那样,编辑表单多地点也能自定义。

先是,大家先自定义字段顺序。 暗中认可地,表单中的字段顺序是与模块中定义是同样的。 我们能够透过动用ModelAdmin子类中的田野s选项来更换它:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    fields = ('title', 'authors', 'publisher', 'publication_date')

改之前:

图片 24

改之后:

图片 25

透过田野(field)s那么些选项,你能够去掉某个不想被别的人编辑的田野同志s 只要不选上不想被编辑的田野先生(s)就可以。

举个例子说,在book数据库中,我们得以隐蔽publication_date,避防止它被编辑。

fields = ('title', 'authors', 'publisher')

 图片 26

 

另一个常用的编排页面自定义是指向多对多字段的。 真如大家在book编辑页面来看的那么,`` 多对多字段`` 被表现有多选框。即便多选框在逻辑上是最适合的HTML控件,但它却不那么好用。 假设你想选用多项,你不可能不还要按下Ctrl键。 纵然管理工具因而加多了解说(help_text),但是当它有几百个选项时,它依旧展现愚笨。

更好的点子是运用

filter_horizontal。让大家把它增添到BookAdmin中,然后看看它的成效。

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    filter_horizontal = ('authors',)

请小心移除田野先生s选项,以使得编辑页面满含全数字段。

加之前

图片 27

给予后,分明有助于多了

图片 28

针对那些具备11个以上采纳的`` 多对多字段`` 使用filter_horizontal。 那比多选框好用多了。

 

ModelAdmin类还帮忙filter_vertical选项。 它像filter_horizontal那样专业,除了控件都以垂直排列,并非水平排列的。 至于使用哪个,只是私家喜欢难题。

 filter_vertical = ('authors',)

图片 29

filter_horizontal和filter_vertical选项只好用在多对多字段上, 而不可能用来ForeignKey字段。 默许地,管理工科具使用`` 下拉框`` 来展现`` 外键`` 字段。但是,正如`` 多对多字段`` 那样,一时候你不想忍受因装载并出示那么些采用而发生的大批量开拓。 例如,大家的book数据库膨胀到持有数千条publishers的笔录,以致于book的丰硕页面装载时间较久,因为它必须把每三个publisher都装载并展现在`` 下拉框`` 中。

缓和那几个主题素材的法子是接纳`` raw_id_fields`` 选项。它是五个暗含外键字段名称的元组,它含有的字段将被表现有`` 文本框`` ,而不再是`` 下拉框`` 。

 

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher','publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    filter_vertical = ('authors',)
    raw_id_fields = ('publisher',)

效果:

图片 30

图片 31

在那么些输入框中,你输入什么吧? publisher的数据库ID号。 牵记到大家日常不会铭记这么些数据库ID,管理工科具提供了三个放大镜图标方便你输入。点击那贰个Logo将会弹出二个窗口,在那里你能够挑选想要增加的publisher。

Django2.0文档,

第六章 Django站点管理

 1.创建admin用户

python manage.py createsuperuser

 访问:

图片 32

能够见到唯有Groutps和Users

图片 33

要向让app book里面包车型地铁models显示在这里面,只需把book注册到admin

book app下的admin.py

from django.contrib import admin
from book import models

# Register your models here.
admin.site.register(models.Author)
admin.site.register(models.Book)
admin.site.register(models.Publisher)

然后就足以在管制分界面看到

图片 34

中文展现的措施:Meta

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    class Meta:
        verbose_name_plural = "出版社"

    def __str__(self):
        return self.name

2.注释

就好像HTML也许Python,Django模板语言一样提供代码注释。 注释使用 {# #} :

{# This is a comment #}

假使要贯彻多行注释,可以利用`` {% comment %}`` 模板标签,就像是那样:

{% comment %}
This is a
multi‐line comment.
{% endcomment %}

2.注释

就像是HTML也许Python,Django模板语言同样提供代码注释。 注释使用 {# #} :

{# This is a comment #}

若果要实现多行注释,能够采纳`` {% comment %}`` 模板标签,就如这么:

{% comment %}
This is a
multi‐line comment.
{% endcomment %}

本文由金沙澳门官网发布于网络编程,转载请注明出处:11.Django2.0文档

关键词: 金沙澳门官网