From 310fd066e91f454b990372ffa30e803cc8120975 Mon Sep 17 00:00:00 2001 From: Florian Merz Date: Thu, 11 Feb 2021 12:56:40 +0100 Subject: unslug zh-cn: move --- .../learn/server-side/django/admin_site/index.html | 339 +++++++++++++++++ .../django/development_environment/index.html | 406 +++++++++++++++++++++ .../learn/server-side/django/home_page/index.html | 358 ++++++++++++++++++ .../index.html" | 358 ------------------ .../index.html" | 406 --------------------- .../index.html" | 339 ----------------- 6 files changed, 1103 insertions(+), 1103 deletions(-) create mode 100644 files/zh-cn/learn/server-side/django/admin_site/index.html create mode 100644 files/zh-cn/learn/server-side/django/development_environment/index.html create mode 100644 files/zh-cn/learn/server-side/django/home_page/index.html delete mode 100644 "files/zh-cn/learn/server-side/django/\344\270\273\351\241\265\346\236\204\345\273\272/index.html" delete mode 100644 "files/zh-cn/learn/server-side/django/\345\274\200\345\217\221\347\216\257\345\242\203/index.html" delete mode 100644 "files/zh-cn/learn/server-side/django/\347\256\241\347\220\206\347\253\231\347\202\271/index.html" (limited to 'files/zh-cn/learn/server-side/django') diff --git a/files/zh-cn/learn/server-side/django/admin_site/index.html b/files/zh-cn/learn/server-side/django/admin_site/index.html new file mode 100644 index 0000000000..d3252d84c5 --- /dev/null +++ b/files/zh-cn/learn/server-side/django/admin_site/index.html @@ -0,0 +1,339 @@ +--- +title: 'Django Tutorial Part 4: Django 管理员站点' +slug: learn/Server-side/Django/管理站点 +translation_of: Learn/Server-side/Django/Admin_site +--- +
{{LearnSidebar}}
+ +
{{PreviousMenuNext("Learn/Server-side/Django/Models", "Learn/Server-side/Django/Home_page", "Learn/Server-side/Django")}}
+ +

好了,我们已经为本地图书馆网站 LocalLibrary 创建了模型,我们接下来使用 Django 管理站点去添加 一些 “真“书数据。首先我们展示如何用管理站点注册模型,然后展示如何登录和创建一些数据。本文最后,我们介绍你可以进一步改进管理站点的建议。

+ + + + + + + + + + + + +
前提:完成: Django Tutorial Part 3: 使用模型
目的: +

了解关于管理站点的优点与缺点,并且可以使用它为我们模型创建一些记录。

+
+ +

综述

+ +

Django管理应用程序可以使用您的模型自动构建可用于创建,查看,更新和删除记录的站点区域。这可以在开发过程中节省大量的时间,从而很容易测试您的模型,并了解您是否拥有正确的数据。根据网站的类型,管理应用程序也可用于管理生产中的数据。Django项目建议仅用于内部数据管理(即仅供管理员或组织内部人员使用),因为以模型为中心的方法不一定是所有用户最好的界面,并且暴露了大量不必要的细节关于模型。

+ +

创建基础项目时,自动完成所有将您的网站中的管理应用程序包含在内的配置文件 (有关所需实际依赖关系的信息  (如有需要请看 Django docs here). 其结果是,你必须做你的模型添加到管理应用程序是  注册  他们。在本文末尾,我们将简要介绍如何进一步配置管理区域以更好地显示我们的模型数据。

+ +

注册模型后,我们将展示如何创建一个新的“超级用户”,登录到该网站,并创建一些书籍,作者,书籍实例和流派。这些将有助于测试我们将在下一个教程中开始创建的视图和模板。

+ +

注册模型

+ +

首先,在目录应用程序(/locallibrary/catalog/admin.py)中打开 admin.py 。此时此刻它看起来像这样—注意它已经导入了django.contrib.admin:

+ +
from django.contrib import admin
+
+# Register your models here.
+
+ +

通过将以下文本复制到文件的底部来注册模型。该代码简单地导入模型,调用 admin.site.register 来注册它们。

+ +
from .models import Author, Genre, Book, BookInstance
+
+admin.site.register(Book)
+admin.site.register(Author)
+admin.site.register(Genre)
+admin.site.register(BookInstance)
+
+ +
注意: 如果你接受创建模型以表示书籍的自然语言的挑战(see the models tutorial article), 导入并注册。
+ +

这是在网站上注册模型或多模型的简单方法,管理站点是高度可定制的,我们将进一步讨论注册模型的其他方式。

+ +

创建一个超级用户

+ +

为了登录管理员站点,我们需要启动工作人员状态的用户账户。为了查看和创建记录,我们还需要该用户具有所有对象的记录。你可以创建一个“超级用户”账号,该账号具有完全访问该站点和所有必需的权限可以使用manage.py

+ +

调用接下来的命令,在同样的目录下,manage.py 创建超级用户。你将被提示输入用户名,电子邮件地址,和强密码。

+ +
python3 manage.py createsuperuser
+
+ +

一旦命令完成,一个新超级用户将被添加到数据库。现在重新启动开发服务器,以便我们可以测试登录名:

+ +
python3 manage.py runserver
+
+ +

登入并使用该网站

+ +

登录网站,打开 /admin (e.g. http://127.0.0.1:8000/admin)
+ 和进入你的新超级用户名和密码凭据(你将被重定向到 登录页面,然后在你进入你的详细信息后回到 /admin URL

+ +

这部分网站展示我们所有的模型,按安装的应用程序分组。你可以点击模型名称来进入到 它所有相关详细记录的页面,你可以进一步点击这些记录进行编辑。你也可以直接点击每个模型旁边的添加链接,开始创建该类型的记录。

+ +

Admin Site - Home page

+ +

点击图书右侧的添加链接来新建一本书(这将显示一个类似下面的对话框)。注意每个字段标题,使用的小部件的类型以及help_text(如果有的话)你要在模型中匹配指定的值。

+ +

输入字段的值,你可以创建一个新的作者或类型通过 按 + 按钮(或者如果你已经创建选项,选择已有的值)。完成后,你可以按 保存保存并添加另一个,或保存并继续编辑来保存记录。

+ +

Admin Site - Book Add

+ +
+

注意: 在这里,我们希望你花费一点时间添加一些书,作者,类型(如: 幻想)到你的应用。确保每个作者和类型都包含几本不同的书籍(这会是你的列表和详细视图在文章系列中后期使用时更有趣)。

+
+ +

我们完成添加书籍,在顶部标签中,点击 Home 链接将回到主管理页面。然后点击 Books 链接显示当前书籍的列表(或其他链接之一,以查看其他型号列表)。现在你已经添加了几本书,列表可能与下面的截图类似。显示每本书的标题;这是书模型 __str__() 方法返回的值,在上一文章中提到。

+ +

Admin Site - List of book objects

+ +

从该列表中,您可以通过选中不需要的图书旁边的复选框来删除图书,从“ 操作”下拉列表中选择“ 删除”操作  ,然后按Go按钮。您也可以通过按下ADD BOOK按钮添加新书。

+ +

您可以通过在链接中选择其名称来编辑书籍。一本书的编辑页面如下所示,与“添加”页面几乎相同。主要的区别是页面标题(更改书)和添加  删除,历史和VIEW ON SITE按钮(最后一个按钮出现,因为我们定义了get_absolute_url()我们的模型中的  方法)。

+ +

Admin Site - Book Edit

+ +

现在回到主页(使用主页链接的导航痕迹),然后查看作者  和类型  列表 - 您应该已经有很多创建从添加新书,但可以自由添加一些更多。

+ +

你不会有任何书籍实例,因为这些不是从图书创建的(虽然你可以从 BookInstance - 创建一个书  - 这是ForeignKey字段的性质)。返回主页,然后按关联的添加按钮显示下面的添加书实例屏幕。请注意,全球唯一的ID,可用于单独标识库中单书的副本。

+ +

Admin Site - BookInstance Add

+ +

为你的书创建一些记录。将状态设置为可用于至少一些记录,并为其他记录贷款。如果状态 不可 用,则还设置未来到期日期。

+ +

而已!您现在已经学会了如何 设置和使用管理站点。您还创建书的记录,BookInstance,Genre,和Author 我们就可以一次我们创造我们自己的观点和模板使用。

+ +

高级配置

+ +

Django 使用注册模型的信息为创建基本管理站点做了非常好的工作:

+ + + +

你可以进一步自定义界面,使它更容易使用,你可以改进的一些想法:

+ + + +

在本节中,我们将看一些改进本地图书馆界面的更改,其中包括添加更多信息Book和Author 模型列表,以及改进编辑视图的布局。我们不会改变 Language 和 Genre 模拟演示,因为它们只有一个字段,所以这样没有真正的好处。

+ +

你可以 在The Django Admin site 中找到所以管理员网站自定义选项的完整参考。

+ +

注册 一个 ModelAdmin 类

+ +

在管理界面去改变一个模型的展示方式,当你定义了 ModelAdmin 类(描述布局)和将其注册到模型中。

+ +

让我们开始作者模型。打开 admin.py 在目录应用程序(/locallibrary/catalog/admin.py)。注释你的原始注册(前缀为#)在 Author 模型

+ +
# admin.site.register(Author)
+ +

现在添加一个 AuthorAdmin 和注册,如下

+ +
# Define the admin class
+class AuthorAdmin(admin.ModelAdmin):
+    pass
+
+# Register the admin class with the associated model
+admin.site.register(Author, AuthorAdmin)
+
+ +

我们再为Book 添加 ModelAdmin 类 和 BookInstance 类。我们需要注释我们原始注册:

+ +
#admin.site.register(Book)
+#admin.site.register(BookInstance)
+ +

现在创建和注册新的模型;为了演示的目的,我们将使用@register 装饰器来注册模型(这和 admin.site.register() 语法作用一样)。

+ +
# Register the Admin classes for Book using the decorator
+
+@admin.register(Book)
+class BookAdmin(admin.ModelAdmin):
+    pass
+
+# Register the Admin classes for BookInstance using the decorator
+
+@admin.register(BookInstance)
+class BookInstanceAdmin(admin.ModelAdmin):
+    pass
+
+ +

可以看到我们现在 的 类都是空的 (“pass”),所以管理操作并不会改变,我们现在对这些类进行扩展,以定义我们针对模型的管理行为。

+ +

配置列表视图

+ +

该 本地图书馆 目前列出的所以作者都使用从模型生成的对象名称的__str__() 方法。如果只是几个作者,这无关紧要。但一旦你有许多作者,这可能会重复。要区分它们,或仅仅因为你想要显示有关每个作者的更多有趣的信息,你可以使用list_display 向视图添加其他字段。

+ +

用下面的代码替代 你 AuthorAdmin 的类。在元组中声明要显示列表中的字段名称以所需的顺序排列,如图(这些和原始模型中指定的名称相同)。

+ +
class AuthorAdmin(admin.ModelAdmin):
+    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
+
+ +

重新启动站点并导航到作者列表。现在应该显示上述字段,如下所示:

+ +

Admin Site - Improved Author List

+ +

对于我们的Book模型,我们将另外显示authorgenre。这author是一个ForeignKey字段(一对多)的关系,所以将由__str()__相关记录的值表示。用BookAdmin下面的版本替换课程。

+ +
class BookAdmin(admin.ModelAdmin):
+    list_display = ('title', 'author', 'display_genre')
+
+ +

不幸的是,我们不能直接指定 list_display 中的 genre 字段, 因为它是一个ManyToManyField (Django可以防止这种情况,因为在这样做时会有大量的数据库访问“成本”)。相反,我们将定义一个 display_genre 函数来获取信息作为一个字符串(这是我们上面调用的函数;下面我们将定义它)。

+ +
+

注意:在genre这里获取可能不是一个好主意,因为数据库操作的“成本”。我们向您展示了如何在模型中调用函数的其他原因非常有用 - 例如在列表中的每个项目旁边添加一个“ 删除”链接。

+
+ +

将以下代码添加到Book模型(models.py)中。这将从 genre字段的前三个值(如果存在)创建一个字符串,并创建一个short_description可以在此方法的管理站点中使用的字符串。

+ +
    def display_genre(self):
+        """
+        Creates a string for the Genre. This is required to display genre in Admin.
+        """
+        return ', '.join([ genre.name for genre in self.genre.all()[:3] ])
+    display_genre.short_description = 'Genre'
+
+ +

保存模型并更新管理员后,重新启动站点并转到图书列表页面; 你应该看到像下面这样的书籍清单:

+ +

Admin Site - Improved Book List

+ +

该Genre模型(和Language模式,如果你定义一个)都有一个单一的领域,所以没有一点为他们创造更多的显示领域的附加模型。

+ +
+

注意:值得更新BookInstance模型列表,至少显示状态和预期的返回日期。我们已经补充说,作为本文末尾的挑战!

+
+ +

添加列表过滤器

+ +

一旦列表中有很多项目,就可以过滤哪些项目被显示出来。这是通过在list_filter属性中列出字段来完成的。用BookInstanceAdmin下面的代码片段替换你当前的  类。

+ +
class BookInstanceAdmin(admin.ModelAdmin):
+    list_filter = ('status', 'due_back')
+
+ +

列表视图现在将在右侧包含一个过滤器框。请注意如何选择日期和状态来过滤值:

+ +

Admin Site - BookInstance List Filters

+ +

整理细节视图布局

+ +

默认情况下,详细视图按照其在模型中声明的顺序垂直排列所有字段。您可以更改声明的顺序,哪些字段显示(或排除),区段是否用于组织信息,字段是水平还是垂直显示,甚至是管理窗体中使用的编辑窗口小部件。

+ +
+

注意:LocalLibrary模型比较简单,因此我们不需要更改布局; 不管怎样,我们会做一些改变,只是为了向你展示如何。

+
+ +

控制哪些字段被显示和布局

+ +

更新您的  AuthorAdmin 类以添加fields行,如下所示(粗体):

+ +
class AuthorAdmin(admin.ModelAdmin):
+    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
+    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
+
+ +

fields 属性列表只是要显示在表格上那些领域,如此才能。字段默认情况下垂直显示,但如果您进一步将它们分组在元组中(如上述“日期”字段中所示),则会水平显示。

+ +

重新启动您的应用程序并转到作者详细信息视图 - 现在应该如下所示:

+ +

Admin Site - Improved Author Detail

+ +
+

注意:您还可以使用exclude属性来声明要从表单中排除的属性列表(将显示模型中的所有其他属性)。

+
+ +

剖切细节视图

+ +

你可以使用 fieldsets 属性添加“部分”以在详细信息表单中对相关的模型信息进行分组。

+ +

在  BookInstance模型中,我们有相关的书是什么(即信息  name,imprint和id),并且当将可用(status,due_back)。我们可以通过将粗体文本添加到我们的BookInstanceAdmin类中来将其添加到不同的部分  。

+ +
@admin.register(BookInstance)
+class BookInstanceAdmin(admin.ModelAdmin):
+    list_filter = ('status', 'due_back')
+
+    fieldsets = (
+        (None, {
+            'fields': ('book','imprint', 'id')
+        }),
+        ('Availability', {
+            'fields': ('status', 'due_back')
+        }),
+    )
+ +

每个部分都有自己的标题(或者None如果你不想要一个标题)和字典中的一个相关的元组 - 描述的格式很复杂,但是如果你看上面的代码片段,那么它们很容易理解。

+ +

重新启动并导航到书籍实例视图; 表格应如下所示:

+ +

Admin Site - Improved BookInstance Detail with sections

+ +

关联记录的内联编辑

+ +

有时,可以同时添加关联记录是有意义的。例如,将书籍信息和有关您在同一详细信息页面上的特定副本的信息同时显示可能是有意义的。

+ +

你可以通过声明 inlines, 类型 TabularInline (水平布局 ) or StackedInline (垂直布局 ,就像默认布局)这样做. 您可以通过在您的以下的粗体中添加以下行,将内容中的BookInstance信息添加到我们的Book详细信息中BookAdmin

+ +
class BooksInstanceInline(admin.TabularInline):
+    model = BookInstance
+
+@admin.register(Book)
+class BookAdmin(admin.ModelAdmin):
+    list_display = ('title', 'author', 'display_genre')
+    inlines = [BooksInstanceInline]
+
+ +

尝试重新启动您的应用程序,然后查看图书的视图 - 在底部您应该看到与本书相关的图书实例:

+ +

Admin Site - Book with Inlines

+ +

在这种情况下,我们所做的就是声明我们的tablular内联类,它只是从内联模型添加所有字段。您可以为布局指定各种附加信息,包括要显示的字段,其顺序,是否只读等。(有关详细信息,请参阅  TabularInline ). 

+ +
+

注意:这个功能有一些痛苦的限制!在上面的屏幕截图中,我们有三个现有的书籍实例,其次是新的书籍实例的三个占位符(看起来非常相似!)。默认情况下没有备用书实例会更好,只需使用“ 添加另一个书”实例链接添加它们,或者可以BookInstance从这里列出作为不可读的链接。第一个选项可以通过extraBookInstanceInline模型中将属性设置为0 来完成,自己尝试一下。

+
+ +

挑战自己

+ +

我们在本节学到了很多东西,所以现在是时候尝试一些事情了。

+ +

1. 对于  BookInstance列表视图,添加代码以显示书籍,状态,到期日期和ID(而不是默认__str__()文本)。
+ 2. 添加的在线上市Book项目的Author使用,因为我们做了同样的做法详细视图Book/ BookInstance。

+ +

概要

+ +

而已!您现在已经了解了如何以最简单和改进的形式设置管理站点,如何创建超级用户以及如何导航管理站点以及查看,删除和更新记录。一路上,您创建了一堆书籍,BookInstances,流派和作者,一旦我们创建了自己的视图和模板,我们就可以列出和展示。

+ + + +

进阶阅读

+ + + +

{{PreviousMenuNext("Learn/Server-side/Django/Models", "Learn/Server-side/Django/Home_page", "Learn/Server-side/Django")}}

diff --git a/files/zh-cn/learn/server-side/django/development_environment/index.html b/files/zh-cn/learn/server-side/django/development_environment/index.html new file mode 100644 index 0000000000..fb6041621f --- /dev/null +++ b/files/zh-cn/learn/server-side/django/development_environment/index.html @@ -0,0 +1,406 @@ +--- +title: 设置Django开发环境 +slug: learn/Server-side/Django/开发环境 +tags: + - Python + - django +translation_of: Learn/Server-side/Django/development_environment +--- +
{{LearnSidebar}}
+ +
{{PreviousMenuNext("Learn/Server-side/Django/Introduction", "Learn/Server-side/Django/Tutorial_local_library_website", "Learn/Server-side/Django")}}
+ +

现在,你知道什么是Django。
+ 那么我们将向你展示如何在Windows,Linux(Ubuntu)和 Mac OSX上设置和测试Django开发环境—无论你常用哪种操作系统,本文能给你开发Django应用所需的一切。

+ + + + + + + + + + + + +
先决条件:知道如何在你开发所用的计算机操作系统中,打开终端/命令行和安装软件包。
目的:在你的计算机中运行Django(1.10)开发环境。
+ +

Django 开发环境概述

+ +

Django 使你可以轻松配置自己的电脑,以便开始开发网络应用。本节解释您可以从开发环境中获得什么,并提供一些设置和配置选项的概述。本文的其余部分介绍了在UbuntuMac OSX和Windows上安装Django开发环境的 推荐方法,以及如何测试。

+ +

什么是Django开发环境?

+ +

开发环境是本地计算机上的Django安装,在将Django应用程序部署到生产环境之前,您可以使用它来开发和测试Django应用程序。

+ +

Django 本身提供的主要工具是一组用于创建和使用Django项目的Python脚本,以及可在你电脑的web 浏览器中测试本地Django web应用(在你的计算机,而不是在外部的web 服务器)。

+ +

还有其他外部工具, 它们构成了开发环境的一部分, 我们将不再赘述。这些包括 文本编辑器 或编辑代码的IDE,以及像 Git 这样的源代码控制管理工具,用于安全地管理不同版本的代码。我们假设你已经安装了一个文本编辑器。

+ +

什么是Django设置选项?

+ +

Django 在安装和配置方面非常灵活。Django可以:

+ + + +

每个选项都需要略微不同的配置和设置。以下小节解释了你的一些选择。在本文的其余部分中,我们将介绍Django在几个操作系统上的设置,并且在本教程的剩余模块中将假设你已进行该设置。

+ +
+

注意: 其他可能的安装选项在官方Django文档中介绍。相应文件 点击这里.

+
+ +

支持哪些操作系统?

+ +

Django web应用程序能运行在几乎任何可以运行Python3的计算机上:Windows,Mac OSX,Linux/Unix,Solaris,仅举几例。几乎任何计算机都具备在开发期间运行Django所需的性能。

+ +

在本文中。我们将提供Windows,macOS 和Linux/Unix的说明。

+ +

你应该使用什么版本的Python?

+ +

我们建议你使用最近发行的版本,在本文档写作的时候是Python 3.8.2。

+ +

事实上,Python 3.5 以及更新的版本都可以用来开发,不过对Python 3.5的支持可能会在未来的版本更新中被移除。

+ +

我们建议你使用最新版本的Python 3,除非该站点依赖于仅适用于Python 2 的第三方库。本文将介绍如何为Python 3安装环境(Python 2 的等效设置将非常相似)。

+ + + +
+

注意: Python 2.7 无法用于当前的 Django 发行版本(Django 1.11.x 系列是最后支持 Python 2.7 的版本)。

+
+ +

我们在哪里下载Django?

+ +

有三个地方可以下载Django:

+ + + +

本文介绍如何从PyPi安装Django的最新稳定版本。

+ +

哪个数据库?

+ +

Django支持四个主要数据库(PostgreSQL,MySQL,Oracle和SQLite),还有一些社区库可以为其他流行的SQL和NOSQL数据库提供不同级别的支持。我们建议你为生产和开发选择相同的数据库(尽管Django使用其对象关系映射器(ORM)抽象了许多数据库之间的差异,但是仍然存在本可以避免的潜在问题 ).

+ +

对于本文(和本模块的大部分),我们将使用将数据存储在文件中的SQLite数据库。SQLite旨在用作轻量级数据库,不能支持高并发。然而,这确实是只读的应用程序的绝佳选择。

+ +
+

注意:当你使用标准工具(django-admin)启动你的网站项目时,Django将默认使用SQLite。用来入门时,这是一个很好的选择,因为它不需要额外的配置和设置。

+
+ +

安装本机系统还是Python虚拟环境中?

+ +

当你安装Python3时,将获得一个由所有Python3代码共享的全局环境。虽然你可以在该环境中安装任何你喜欢的Python包,但是每次只能安装每个包的一个特定版本。

+ +
+

注意:安装到全局环境的Python应用程序可能会相互冲突(例如如果它们依赖于同一包的不同版本)。

+
+ +

如果你把Django安装到默认/全局环境中,那么在该计算机上将只能定位到Django的一个版本。如果你想创建新的网站(使用最新版本的Django),同时仍然维护依赖旧版本的网站,这可能是个问题。

+ +

因此,经验丰富的Python/Django开发人员通常在独立Python虚拟环境中运行Python应用程序。这样就可以在一台计算机上实现多个不同的Django环境。Django开发团队同样建议你使用Python虚拟环境。

+ +

本模块假设已经将Django安装到虚拟环境中,下面我们会演示如何进行。

+ +

安装 Python 3

+ +

为了使用Django,你需要在你的操作系统中安装Python。如果你使用Python3,那么你同样需要Python 包管理工具  — pip3 — 用来管理 (安装,更新和删除)被Django和其他Python应用程序使用的Python软件包/库。

+ +

本节简要介绍了如何检查有哪些版本的Python,并根据需要安装适用于 Ubuntu Linux 16.04,macOS, and Windows 10的新版本。

+ +
+

注意: 根据你的平台, 您还可以从操作系统自己的软件包管理器或其他机制安装Python / pip。对于大多数平台,您可以从https://www.python.org/downloads/下载所需的安装文件,并使用该平台特定的方法进行安装。

+
+ +

Ubuntu 18.04

+ +

Ubuntu Linux 18.04 LTS默认包含Python 3.6.6。你可以通过在Bash终端中运行以下命令来确认这一点:

+ +
python3 -V
+ Python 3.6.6
+ +

然而,在默认情况下,为Python 3(包括Django)安装软件包的Python包管理工具不可用。你可以在bash终端中使用以下命令安装pip3

+ +
sudo apt-get install python3-pip
+
+ +

macOS

+ +

macOS 的"El Capitan" 及其他最新版本不包含Python 3。你可以通过在bash终端中运行一下命令来确认:

+ +
python3 -V
+ -bash: python3: command not found
+ +

你可以轻松地从 python.org安装Python 3(以及pip3工具):

+ +
    +
  1. 下载所需的安装程序: +
      +
    1. 点击 https://www.python.org/downloads/
    2. +
    3. 选择 Download Python 3.8.2  (具体的版本号可能不同)。
    4. +
    +
  2. +
  3. 使用Finder找到安装包,然后双击运行,并按照提示进行安装。
  4. +
+ +

之后可以通过检查Python3版本确认是否安装成功,如下所示:

+ +
python3 -V
+Python 3.8.2
+ +

你也可以通过列出可用的包来检查pip3是否安装了:

+ +
pip3 list
+ +

Windows 10

+ +

windows默认不包含Python, 但你可以从 python.org轻松地安装它(以及pip3工具):

+ +
    +
  1. 下载所需版本: +
      +
    1. 点击 https://www.python.org/downloads/
    2. +
    3. 选择 Download Python 3.8.2  (具体的版本号可能不同)。
    4. +
    +
  2. +
  3. 双击现在的文件并按照提示安装Python。
  4. +
  5. 确保勾选了"Add Python to PATH"选项。
  6. +
+ +

你可以在命令提示符中输入以下内容来验证是否安装了Python:

+ +
python -V
+ Python 3.8.2
+
+ +

Windows安装程序默认包含pip3 (Python包管理器)。同样在命令提示符中输入以下内容来列出已安装的包:

+ +
pip3 list
+
+ +
+

注意:安装包应该已把运行上述命令所需的一切设置完成。但如果你得到的消息是找不到Python,那么你可能忘记将Python添加到系统路径中了。你可以通过再次运行安装包,选择"Modify",并在下一页面中勾选 "Add Python to environment variables"来修复这个问题。

+
+ +

在Python虚拟环境中使用Django

+ +

我们使用virtualenvwrapper(Linux及macOS)和 virtualenvwrapper-win(WIndows)来创建Python虚拟环境,而它们又使用了virtualenv。封装工具创建了一个一致的接口来管理各个平台上的接口。

+ +

安装虚拟环境软件

+ +

Ubuntu虚拟环境设置

+ +

安装了Python和pip之后,你就可以安装virtualenvwrapper(包括了virtualenv)。可以在这里找到正式的安装指南,或按照以下指导操作。

+ +

使用pip3安装该工具:​​​​​​

+ +
sudo pip3 install virtualenvwrapper
+ +

然后将以下代码行添加到shell启动文件的末尾(这是主目录中的一个隐藏文件,名字是.bashrc)。这些文件设置了虚拟环境应该存在的位置、开发项目目录的位置以及与这个包一起安装的脚本的位置。

+ +
export WORKON_HOME=$HOME/.virtualenvs
+export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
+export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
+export PROJECT_HOME=$HOME/Devel
+source /usr/local/bin/virtualenvwrapper.sh
+ +
+

注意:VIRTUALENVWRAPPER_PYTHON 和 VIRTUALENVWRAPPER_VIRTUALENV_ARGS变量指向Python3的常规安装位置,source /usr/local/bin/virtualenvwrapper.sh指向virtualenvwrapper.sh脚本的一般安装位置。 如果您在测试时发现virtualenv无法正常工作,则要检查的一件事是Python和该脚本是否在预期的位置(然后适当更改启动文件)。

+ +

你可以使用which virtualenvwrapper.sh 和 which python3命令为你的系统找到正确的安装位置。

+
+ +

然后通过在终端中运行以下命令重载启动文件:

+ +
source ~/.bashrc
+ +

此时,你应该能看到一些脚本正在运行,如下所示:

+ +
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/premkproject
+virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postmkproject
+...
+virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/preactivate
+virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postactivate
+virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/get_env_details
+ +

然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

+ +

macOS 虚拟环境设置

+ +

在macOS上设置virtualenvwrapper 几乎和在Ubuntu上是一样的(你同样可以按照以下指导操作,或在这里找到正式的安装指南)。

+ +

使用pip安装virtualenvwrapper(并绑定virtualenv),如下所示。

+ +
sudo pip3 install virtualenvwrapper
+ +

然后将以下代码行添加到shell启动文件的末尾:

+ +
export WORKON_HOME=$HOME/.virtualenvs
+export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
+export PROJECT_HOME=$HOME/Devel
+source /usr/local/bin/virtualenvwrapper.sh
+ +
+

注意:VIRTUALENVWRAPPER_PYTHON 和 VIRTUALENVWRAPPER_VIRTUALENV_ARGS变量指向Python3的常规安装位置,source /usr/local/bin/virtualenvwrapper.sh指向virtualenvwrapper.sh脚本的一般安装位置。 如果您在测试时发现virtualenv无法正常工作,则要检查的一件事是Python和该脚本是否在预期的位置(然后适当更改启动文件)。

+ +

例如,在macOS上的一个安装测试中,启动文件中必须有以下几行代码:

+ +
export WORKON_HOME=$HOME/.virtualenvs
+export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.7/bin/python3
+export PROJECT_HOME=$HOME/Devel
+source /Library/Frameworks/Python.framework/Versions/3.7/bin/virtualenvwrapper.sh
+ +

你可以使用which virtualenvwrapper.sh 和 which python3命令为你的系统找到正确的安装位置。

+
+ +

此处使用和Ubuntu相同的代码行,但是启动文件是主目录中叫做.bash_profile的隐藏文件。

+ +
+

注意:如果找不到.bash_profile进行编辑,也可以使用nano在终端中打开它,命令看起来类似于:

+ +
cd ~  # Navigate to my home directory
+ls -la #List the content of the directory. YOu should see .bash_profile
+nano .bash_profile # Open the file in the nano text editor, within the terminal
+# Scroll to the end of the file, and copy in the lines above
+# Use Ctrl+X to exit nano, Choose Y to save the file.
+
+ +

然后通过在终端中运行以下命令重载启动文件:

+ +
source ~/.bashrc
+ +

此时,你应该能看到一些脚本正在运行(和Ubuntu中同样的脚本)。然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

+ +

Windows 10 虚拟环境设置

+ +

安装 virtualenvwrapper-win 甚至比设置virtualenvwrapper 更简单,因为你无需配置工具用来存储虚拟环境信息的位置(有一个默认值)。你需要做的只是在命令提示符中运行以下命令:

+ +
pip3 install virtualenvwrapper-win
+ +

然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

+ +

创建虚拟环境

+ +

一旦你成功安装了virtualenvwrapper 或 virtualenvwrapper-win,那么在所有平台中使用虚拟环境的方法是非常相似的。

+ +

现在你可以使用 mkvirtualenv命令创建一个新的虚拟环境。在运行此命令时,你将看到正在设置的环境(你所看到的只略微与平台相关)。命令完成后,新的虚拟环境将被激活——你能看到提示符的开头就是括号中的环境名称(以下我们展示的是Ubuntu的,但是在Windows/macOS上,末行时相似的|)

+ +
$ mkvirtualenv my_django_environment
+
+Running virtualenv with interpreter /usr/bin/python3
+...
+virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/t_env7/bin/get_env_details
+(my_django_environment) ubuntu@ubuntu:~$
+ +

现在你已进入虚拟环境,可以进行Django安装并开始开发。

+ +
+

注意:从现在开始,在本文(实际上是该模块)中,请假定所有命令都在类似于我们上面设置的Python虚拟环境中运行。

+
+ +

使用一个虚拟环境

+ +

您应该知道一些其他有用的命令(在工具的文档中还有更多,但这些是您将经常使用的命令):

+ + + +
+ +

安装Django

+ +

一旦你创建了一个虚拟环境,并且使用workon 进入了它,就可以使用pip3来安装Django。

+ +
pip3 install django
+ +

您可以通过运行以下命令来测试Django是否安装(这只是用来测试Python是否可以找到Django模块):

+ +
# Linux/macOS
+python3 -m django --version
+ 1.10.10
+
+# Windows
+py -3 -m django --version
+ 1.10.10
+
+ +
+

注意如果上面的Windows命令没有显示django模块,请尝试:

+ +
py -m django --version
+ +

在Windows中,Python 3脚本是通过在命令前面加上py -3来启动的,尽管该脚本可能会因您的特定安装而有所不同。 如果遇到命令问题,请尝试省略-3修饰符。 在Linux /macOS中,命令是python3。

+
+ +
+

重要提示:本模块的其余部分使用Linux命令来调用Python 3(python3)。如果您在Windows上工作,只需将此前缀替换为: py -3

+
+ +

测试你的安装

+ +

上面的测试工作并不是很有趣。一个更有趣的测试是创建一个框架项目并查看它的工作情况。要做到这一点,先在你的命令提示符/终端导航到你想存储你Django应用程序的位置。为您的测试站点创建一个文件夹并进入其中。

+ +
mkdir django_test
+cd django_test
+
+ +

然后,您可以像所展示的一样使用django-admin工具创建一个名为“ mytestsite ” 的新框架站点。创建网站后,您可以CD到此文件夹,并将在其中找到管理项目的主要脚本,名为manage.py

+ +
django-admin startproject mytestsite
+cd mytestsite
+ +

我们可以在这个文件夹中使用manager.pyrunserver命令运行开发web服务器,如下所示。

+ +
$ python3 manage.py runserver
+Performing system checks...
+
+System check identified no issues (0 silenced).
+
+You have 15 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.
+
+December 16, 2018 - 07:06:30
+Django version 2.2.12, using settings 'mytestsite.settings'
+Starting development server at http://127.0.0.1:8000/
+Quit the server with CONTROL-C.
+ +
+

注意:上面的命令显示了Linux /macOS命令。您可以忽略关于“15 unapplied migration(s)”的警告!

+
+ +

一旦服务器运行,您可以通过本地Web浏览器打开http://127.0.0.1:8000/来查看该站点。你应该看到一个如下所示的网站:

+ +

The home page of the skeleton Django app.

+ + + +

概要

+ +

现在,你的计算机中已经启动并运行了一个Django开发环境。

+ +

在测试部分,您还简要地了解了如何使用django -admin startproject创建一个新的Django网站,并使用开发web服务器(python3 manager .py runserver)在浏览器中运行它。在下一篇文章中,我们将对此过程进行扩展,构建一个简单但完整的web应用程序。

+ +

看看瞧瞧

+ + + +

{{PreviousMenuNext("Learn/Server-side/Django/Introduction", "Learn/Server-side/Django/Tutorial_local_library_website", "Learn/Server-side/Django")}}

diff --git a/files/zh-cn/learn/server-side/django/home_page/index.html b/files/zh-cn/learn/server-side/django/home_page/index.html new file mode 100644 index 0000000000..0527ba8731 --- /dev/null +++ b/files/zh-cn/learn/server-side/django/home_page/index.html @@ -0,0 +1,358 @@ +--- +title: 'Django Tutorial Part 5: 主页构建' +slug: learn/Server-side/Django/主页构建 +translation_of: Learn/Server-side/Django/Home_page +--- +
{{LearnSidebar}}
+ +
{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}
+ +

  我们现在可以添加代码来显示我们的第一个完整页面 -  LocalLibrary 网站的主页,显示每个模型类型有多少条记录,并提供我们其他页面的侧边栏导航链接。一路上,我们将获得编写基本URL地图和视图,从数据库获取记录以及使用模板的实践经验。

+ + + + + + + + + + + + +
前提:读 the Django Introduction. 完成上章节 (including Django Tutorial Part 4: Django admin site).
目的:了解如何创建简单的URL映射和视图(没有数据编码在URL中)以及如何从模型中获取数据并创建模版。
+ +

概要

+ +

现在我们已经定义了我们的模型,并创建了一些初始库记录来处理,现在是编写代码以向用户呈现该信息的时候了。我们需要做的第一件事是确定我们希望能够在我们的页面中显示哪些信息,然后为返回这些资源定义适当的URL。那么我们将需要创建一个url映射器,视图和模板来显示这些页面。

+ +

以下图表提供了处理HTTP请求/响应时需要实现的数据和事情的主要流程。我们已经创建了这个模型,我们需要创建的主要内容是:

+ + + +

+ +

正如你将在下一节中看到的,我们将要显示5个页面,这在一篇文章中是很重要的。因此,本文的大部分内容将重点介绍如何实现主页(我们将在随后的文章中介绍其他页面)。这应该让您对URL映射器,视图和模型在实践中如何工作有一个很好的端到端的了解。

+ +

定义资源URL

+ +

由于本版本的LocalLibrary对于最终用户本质上是只读的,所以我们只需要为该网站(主页)提供一个着陆页,以及显示书籍和作者的列表和详细视图的页面。

+ +

下面这些URL 是我们页面需要的:

+ + + +

前三个URL用于列出索引,书籍和作者。这些不会对任何附加信息进行编码,而返回的结果将取决于数据库中的内容,运行获取信息的查询将始终保持一致。

+ +

相比之下,最后两个URL用于显示有关特定书籍或作者的详细信息 - 这些URL将编码要显示在URL中的项目的标识(如上所示<id>)。URL映射器可以提取编码信息并将其传递给视图,然后将动态地确定从数据库获取哪些信息。通过对我们的URL中的信息进行编码,我们只需要一个URL映射,视图和模板来处理每本书(或作者)。

+ +
+

注意:Django允许您以任何您喜欢的方式构建您的URL - 您可以如上所示编码URL正文中的信息,或使用URL GET参数(例如  /book/?id=6)。无论您使用哪种方法,URL都应保持清洁,逻辑和可读性 (check out the W3C advice here).
+
+ Django文档倾向于在URL的主体中推荐编码信息,这是他们觉得鼓励更好的URL设计的实践。

+
+ +

如概述,本文其余部分介绍如何构建索引页

+ +

创建索引页

+ +

我们创建的第一个页面将会是索引页(catalog/)。这会显示一些静态HTML,以及数据库中不同记录的一些计算的“计数“。为了使其工作,我们必须创建一个URL映射,视图和模版。

+ +
+

注意: 本节应该特别注意。一些”材料“在所有页面都通用。

+
+ +

URL 映射

+ +

在我们创建的基础网站上,更新 /locallibrary/urls.py 文件。以确保每当收到以catalog/开头的URL时,URLConf模块中的catalog.urls 会处理剩余的字符串。

+ +

打开 catalog/urls.py ,复制下面代码

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

如果检测到URL模式'',(views.index——在view.py中函数命名index() )将被调用。URL模式是Python 正则表达式 (RE)。我们将在本教程中进一步介绍RE。

+ +
+

注意: 在  /locallibrary/locallibrary/urls.py 

+ +
urlpatterns += [
+    path('catalog/', include('catalog.urls')),
+]
+ +

每当Django 使用 include() (django.conf.urls.include()),它排除与该点 匹配URL的任何部分,并将剩余的字符串发送到随附的 URLconf 进行一步处理。

+ +

匹配的URL 实际上是 catalog/+<空字符串> (/catalog/ 假定是因为 include()是使用的方法)。如果我们收到一个URL的HTTP请求,我们的第一个视图函数将被调用/catalog/。

+
+ +

此函数还说明了一个name参数,此唯一标识指定 URL 映射。你可以使用 "reverse" 映射—去动态创建指定映射设计处理的资源的一个URL。例如,我们现在可以通过在我们的模版中创建以下链接到我们的主页:

+ +
<a href="{% url 'index' %}">Home</a>.
+ +
+

注意: 我们当然可以硬编码上面的链接(如:<a href="/catalog/">Home</a>),但是如果我们改变了主页的模式,模版将不再正确链接,使用反向网址映射会更灵活和强大。

+
+ +

View (基于功能)

+ +

视图是处理HTTP请求的功能,根据需要从数据库获取数据,通过使用HTML模板呈现此数据生成HTML页面,然后以HTTP响应返回HTML以显示给用户。索引视图遵循此模型 - 它提取有关数据库中有多少BookBookInstance 可用 BookInstance Author 记录的信息,并将其传递给模板以进行显示。

+ +

打开catalog / views.py,并注意该文件已经导入了 使用模板和数据生成HTML文件的 render() 快捷方式函数。

+ +
from django.shortcuts import render
+
+# Create your views here.
+
+ +

复制文件底部的以下代码。第一行导入我们将用于访问所有视图中数据的模型类。

+ +
from .models import Book, Author, BookInstance, Genre
+
+def index(request):
+    """
+    View function for home page of site.
+    """
+    # Generate counts of some of the main objects
+    num_books=Book.objects.all().count()
+    num_instances=BookInstance.objects.all().count()
+    # Available books (status = 'a')
+    num_instances_available=BookInstance.objects.filter(status__exact='a').count()
+    num_authors=Author.objects.count()  # The 'all()' is implied by default.
+
+    # Render the HTML template index.html with the data in the context variable
+    return render(
+        request,
+        'index.html',
+        context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors},
+    )
+ +

视图函数的第一部分使用objects.all()模型类的属性来获取记录计数。它还会获取一个BookInstance状态字段值为“a”(可用)的对象列表。您可以在前面的教程 (Django Tutorial Part 3: Using models > Searching for records)中找到更多关于如何访问模型的信息。

+ +

在函数结束时,我们将该函数称为render()创建和返回HTML页面作为响应(此快捷方式函数包含许多其他函数,简化了这种非常常见的用例)。它将原始request对象(an HttpRequest)作为参数,具有数据占位符的HTML模板以及context变量(包含要插入到这些占位符中的数据的Python字典)。

+ +

我们将在下一节中详细介绍模板和上下文变量; 让我们创建我们的模板,以便我们可以向用户显示一些内容

+ +

模版

+ +

模版是定义一个文件(例如HTML页面)的结构与布局的文本文件,其中占位符用于表示实际内容。Django将自动在应用程序“templates”目录查找模版。所以例如,在我们刚刚加的索引页,render() 函数会期望能够找到/locallibrary/catalog/templates/index.html这个文件,如何找不到该文件,则会引发错误。如果保存以前的更改并返回到浏览器,你可以看到访问 127.0.0.1:8000 现在将提供你一个相当直观的错误信息"TemplateDoesNotExist at /catalog/“以及其他详细信息。

+ +
+

注意: Django 将根据你的项目的设置文件, 来查看模版的许多位置 (在已安装的应用程序中进行搜索是默认设置). 你可以查阅更多关于Django如何找到模版以及它支持的模版格式在(Templates )。

+
+ +

扩展模版

+ +

索引模版将需要标准的HTML标记头部和正文,以及用于导航的部分(去我们尚为创建的网站其他的页面)以及显示一些介绍文本和我们书籍数据。我们网站上的每一页,大部分文字(HTML和导航结构)都是一样的。Django模版语言不是强制开发人员在每个页面中复制这个“样板”,而是让你声明一个基本模版,然后再扩展它,仅替换每个特定页面不同的位置。

+ +

例如,基本模版 base_generic.html 可能看起来像下面的文本。正如你所见的,它包含一些“常见“HTML”和标题,侧边栏和使用命名 blockendblock 模版标记(粗体显示)标记的内容部分。块可以是空的,或者包含将被派生页“默认使用”的内容。

+ +
+

注意: 模版标签就像你可以在模版中使用的函数循环列表,基于变量的值执行条件操作等。除了模版标签,模版语法允许你引用模版变量(通过从视图进入模版),并使用模版过滤器,其中重新格式化变量(例如,将字符串设置为小写)。

+
+ +
<!DOCTYPE html>
+<html lang="en">
+<head>
+  {% block title %}<title>Local Library</title>{% endblock %}
+</head>
+
+<body>
+  {% block sidebar %}<!-- insert default navigation text for every page -->{% endblock %}
+  {% block content %}<!-- default content text (typically empty) -->{% endblock %}
+</body>
+</html>
+
+ +

当我们要为特定视图定义一个模版时,我们首先指定基本模版(使用 extends 模版标签—查看下一个代码片段)。如果我们想要在模版中替换的章节,会使用相同的 block/endblock 部分在基本模版表明。

+ +

例如,下面我们使用 extends 模版标签,并覆盖 content 块。生成的最终HTML页面将具有基本模版中定义的所以HTML和结构(包括你在title块中定义的默认内容),但你新的 content 块插入到了默认的那块。

+ +

base_generic.html 详细会在下文中,请耐心往下看。

+ +
{% extends "base_generic.html" %}
+
+{% block content %}
+<h1>Local Library Home</h1>
+<p>Welcome to <em>LocalLibrary</em>, a very basic Django website developed as a tutorial example on the Mozilla Developer Network.</p>
+{% endblock %}
+ +

本地图书馆-基本模版

+ +

下面就是我们计划的基本模版用于本地图书馆网站。正如所看到的,内容包括一些HTML和定义块 titlesidebarcontent。我们有默认的 title(当然我们可以改)和默认的所以书籍和作者的链接列表 sidebar (我们可能并不会怎么改,但需要时,我们通过把想法放入块block中,比如想法是—允许范围)。

+ +
+

注意: 我们再介绍两个额外的模版标签: urlload static 。下文中我们会详细介绍。

+
+ +

创建一个新的文件 — /locallibrary/catalog/templates/base_generic.html — 写入如下代码

+ +
<!DOCTYPE html>
+<html lang="en">
+<head>
+
+  {% block title %}<title>Local Library</title>{% endblock %}
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
+  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
+  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
+
+  <!-- Add additional CSS in static file -->
+  {% load static %}
+  <link rel="stylesheet" href="{% static 'css/styles.css' %}">
+</head>
+
+<body>
+
+  <div class="container-fluid">
+
+    <div class="row">
+      <div class="col-sm-2">
+      {% block sidebar %}
+      <ul class="sidebar-nav">
+          <li><a href="{% url 'index' %}">Home</a></li>
+          <li><a href="">All books</a></li>
+          <li><a href="">All authors</a></li>
+      </ul>
+     {% endblock %}
+      </div>
+      <div class="col-sm-10 ">
+      {% block content %}{% endblock %}
+      </div>
+    </div>
+
+  </div>
+</body>
+</html>
+ +

该模版使用(并包含)JavaScript 和  Bootstrap  (css框架)来改进HTML页面的布局和显示,这个框架或者另一个客户端网络框架,这是快速创建一个可用页面来适应在不同浏览器尺寸和允许我们处理页面呈现且不用一点细节—我们只需要专注在服务器端。

+ +

基本模版还引用了一个本地css文件 (styles.css) ,它提供了一些额外的样式。 新建 /locallibrary/catalog/static/css/styles.css 如下:

+ +
.sidebar-nav {
+    margin-top: 20px;
+    padding: 0;
+    list-style: none;
+}
+ +

索引模版

+ +

新建HTML文件 /locallibrary/catalog/templates/index.html 写入下面代码。第一行我们扩展了我们的基本模版, 使用 content替换默认块。

+ +
{% extends "base_generic.html" %}
+
+{% block content %}
+<h1>Local Library Home</h1>
+
+  <p>Welcome to <em>LocalLibrary</em>, a very basic Django website developed as a tutorial example on the Mozilla Developer Network.</p>
+
+<h2>Dynamic content</h2>
+
+  <p>The library has the following record counts:</p>
+  <ul>
+    <li><strong>Books:</strong> \{{ num_books }}</li>
+    <li><strong>Copies:</strong> \{{ num_instances }}</li>
+    <li><strong>Copies available:</strong> \{{ num_instances_available }}</li>
+    <li><strong>Authors:</strong> \{{ num_authors }}</li>
+  </ul>
+
+{% endblock %}
+ +
+

注意:由于本网站就是通过django 来运维,\{{ 的模版标签 在上面代码中会运行,只能通过增加 \ 来转义,而不能直接写出“双大括号”。

+
+ +

在动态内容部分,我们的占位符(模版变量),是给我们想要视图的信息声明。变量使用“双大括号“ 或者“句柄“语法进行标记。

+ +
+

注意: 你可以轻松地识别是否使用变量或模版标签(函数),因为变量具有双括号(\{{ num_books }}) 而标记被包含在带有百分比符号 ({% extends "base_generic.html" %})的单个大括号中。

+
+ +

这里要注意的重要事情是这些变量用我们视图函数render中的字典—注入 context (下面);当渲染模版时,这些将替换为相关联的值。

+ +
return render(
+    request,
+    'index.html',
+     context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors},
+)
+ +

在模版中引用静态文件

+ +

你的项目可能会使用静态资源,包括javascriptcss 和图像。由于这些文件的位置可能不知道(或者可能会发生变化),则Django允许你指定你的模版相对于这些文件的位置 STATIC_URL 全局设置(默认基本网站设置的值 STATIC_URL,以“/static/”,但你可能选择在CDN和其他地方托管内容)。

+ +

在模版中,你首先调用 load 指定“ static”去添加此模版库(如下)。静态加载后,你可以使用 static 模版标签,指定感兴趣的文件相对URL

+ +
 <!-- Add additional CSS in static file -->
+{% load static %}
+<link rel="stylesheet" href="{% static 'css/styles.css' %}">
+ +

你可以用同样的方式将图像添加到页面中:

+ +
{% load static %}
+<img src="{% static 'catalog/images/local_library_model_uml.png' %}" alt="My image" style="width:555px;height:540px;"/>
+
+ +
+

主题: 上面的更改指定文件所在的位置,但Django默认不提供它们。当我们created the website skeleton,我们在全局URL映射器r (/locallibrary/locallibrary/urls.py) 中开发Web服务器提供服务,你仍然需要安排它们在生产中投放。我们接下来看一看

+
+ +

更多内容—Managing static files (Django docs).

+ +

链接URLs

+ +

基本的模版引入 url 模版标签

+ +
<li><a href="{% url 'index' %}">Home</a></li>
+
+ +

此标记url()使用您的urls.py中调用的函数的名称 和相关视图将从该函数接收的任何参数的值,并返回可用于链接到该资源的URL。

+ +

它看起来什么样?

+ +

运行 (python3 manage.py runserver) 和在浏览器中打开 http://127.0.0.1:8000/. I如果一切都正确设置,当当当当。

+ +

Index page for LocalLibrary website

+ +
+

注意:由于尚未定义这些网页的网址,视图和模板,因此您将无法使用“ 所有图书所有作者”链接(目前我们刚刚在base_generic.html模板中插入了这些链接的占位符

+
+ +

挑战自己

+ +

以下是一些测试您熟悉模型查询,视图和模板的任务。

+ +

   1. 在索引模板中声明一个新的标题块,并更改页面标题以匹配此特定页面。
+    2. 修改视图以生成包含特定单词(不区分大小写)的类型计数和书数,然后将这些字段添加到模板。

+ + + +

概要

+ +

我们现在已经为我们的网站创建了主页 - 一个HTML页面,显示数据库中的一些记录数,并且链接到我们其他尚待创建的页面。一路上,我们已经学到了很多有关url映射器,视图,使用我们的模型查询数据库的基本信息,如何从您的视图传递信息到模板,以及如何创建和扩展模板。

+ +

在我们的下一篇文章中,我们将基于我们的知识来创建其他四个页面。

+ +

也可以看看

+ + + +

{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}

diff --git "a/files/zh-cn/learn/server-side/django/\344\270\273\351\241\265\346\236\204\345\273\272/index.html" "b/files/zh-cn/learn/server-side/django/\344\270\273\351\241\265\346\236\204\345\273\272/index.html" deleted file mode 100644 index 0527ba8731..0000000000 --- "a/files/zh-cn/learn/server-side/django/\344\270\273\351\241\265\346\236\204\345\273\272/index.html" +++ /dev/null @@ -1,358 +0,0 @@ ---- -title: 'Django Tutorial Part 5: 主页构建' -slug: learn/Server-side/Django/主页构建 -translation_of: Learn/Server-side/Django/Home_page ---- -
{{LearnSidebar}}
- -
{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}
- -

  我们现在可以添加代码来显示我们的第一个完整页面 -  LocalLibrary 网站的主页,显示每个模型类型有多少条记录,并提供我们其他页面的侧边栏导航链接。一路上,我们将获得编写基本URL地图和视图,从数据库获取记录以及使用模板的实践经验。

- - - - - - - - - - - - -
前提:读 the Django Introduction. 完成上章节 (including Django Tutorial Part 4: Django admin site).
目的:了解如何创建简单的URL映射和视图(没有数据编码在URL中)以及如何从模型中获取数据并创建模版。
- -

概要

- -

现在我们已经定义了我们的模型,并创建了一些初始库记录来处理,现在是编写代码以向用户呈现该信息的时候了。我们需要做的第一件事是确定我们希望能够在我们的页面中显示哪些信息,然后为返回这些资源定义适当的URL。那么我们将需要创建一个url映射器,视图和模板来显示这些页面。

- -

以下图表提供了处理HTTP请求/响应时需要实现的数据和事情的主要流程。我们已经创建了这个模型,我们需要创建的主要内容是:

- - - -

- -

正如你将在下一节中看到的,我们将要显示5个页面,这在一篇文章中是很重要的。因此,本文的大部分内容将重点介绍如何实现主页(我们将在随后的文章中介绍其他页面)。这应该让您对URL映射器,视图和模型在实践中如何工作有一个很好的端到端的了解。

- -

定义资源URL

- -

由于本版本的LocalLibrary对于最终用户本质上是只读的,所以我们只需要为该网站(主页)提供一个着陆页,以及显示书籍和作者的列表和详细视图的页面。

- -

下面这些URL 是我们页面需要的:

- - - -

前三个URL用于列出索引,书籍和作者。这些不会对任何附加信息进行编码,而返回的结果将取决于数据库中的内容,运行获取信息的查询将始终保持一致。

- -

相比之下,最后两个URL用于显示有关特定书籍或作者的详细信息 - 这些URL将编码要显示在URL中的项目的标识(如上所示<id>)。URL映射器可以提取编码信息并将其传递给视图,然后将动态地确定从数据库获取哪些信息。通过对我们的URL中的信息进行编码,我们只需要一个URL映射,视图和模板来处理每本书(或作者)。

- -
-

注意:Django允许您以任何您喜欢的方式构建您的URL - 您可以如上所示编码URL正文中的信息,或使用URL GET参数(例如  /book/?id=6)。无论您使用哪种方法,URL都应保持清洁,逻辑和可读性 (check out the W3C advice here).
-
- Django文档倾向于在URL的主体中推荐编码信息,这是他们觉得鼓励更好的URL设计的实践。

-
- -

如概述,本文其余部分介绍如何构建索引页

- -

创建索引页

- -

我们创建的第一个页面将会是索引页(catalog/)。这会显示一些静态HTML,以及数据库中不同记录的一些计算的“计数“。为了使其工作,我们必须创建一个URL映射,视图和模版。

- -
-

注意: 本节应该特别注意。一些”材料“在所有页面都通用。

-
- -

URL 映射

- -

在我们创建的基础网站上,更新 /locallibrary/urls.py 文件。以确保每当收到以catalog/开头的URL时,URLConf模块中的catalog.urls 会处理剩余的字符串。

- -

打开 catalog/urls.py ,复制下面代码

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

如果检测到URL模式'',(views.index——在view.py中函数命名index() )将被调用。URL模式是Python 正则表达式 (RE)。我们将在本教程中进一步介绍RE。

- -
-

注意: 在  /locallibrary/locallibrary/urls.py 

- -
urlpatterns += [
-    path('catalog/', include('catalog.urls')),
-]
- -

每当Django 使用 include() (django.conf.urls.include()),它排除与该点 匹配URL的任何部分,并将剩余的字符串发送到随附的 URLconf 进行一步处理。

- -

匹配的URL 实际上是 catalog/+<空字符串> (/catalog/ 假定是因为 include()是使用的方法)。如果我们收到一个URL的HTTP请求,我们的第一个视图函数将被调用/catalog/。

-
- -

此函数还说明了一个name参数,此唯一标识指定 URL 映射。你可以使用 "reverse" 映射—去动态创建指定映射设计处理的资源的一个URL。例如,我们现在可以通过在我们的模版中创建以下链接到我们的主页:

- -
<a href="{% url 'index' %}">Home</a>.
- -
-

注意: 我们当然可以硬编码上面的链接(如:<a href="/catalog/">Home</a>),但是如果我们改变了主页的模式,模版将不再正确链接,使用反向网址映射会更灵活和强大。

-
- -

View (基于功能)

- -

视图是处理HTTP请求的功能,根据需要从数据库获取数据,通过使用HTML模板呈现此数据生成HTML页面,然后以HTTP响应返回HTML以显示给用户。索引视图遵循此模型 - 它提取有关数据库中有多少BookBookInstance 可用 BookInstance Author 记录的信息,并将其传递给模板以进行显示。

- -

打开catalog / views.py,并注意该文件已经导入了 使用模板和数据生成HTML文件的 render() 快捷方式函数。

- -
from django.shortcuts import render
-
-# Create your views here.
-
- -

复制文件底部的以下代码。第一行导入我们将用于访问所有视图中数据的模型类。

- -
from .models import Book, Author, BookInstance, Genre
-
-def index(request):
-    """
-    View function for home page of site.
-    """
-    # Generate counts of some of the main objects
-    num_books=Book.objects.all().count()
-    num_instances=BookInstance.objects.all().count()
-    # Available books (status = 'a')
-    num_instances_available=BookInstance.objects.filter(status__exact='a').count()
-    num_authors=Author.objects.count()  # The 'all()' is implied by default.
-
-    # Render the HTML template index.html with the data in the context variable
-    return render(
-        request,
-        'index.html',
-        context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors},
-    )
- -

视图函数的第一部分使用objects.all()模型类的属性来获取记录计数。它还会获取一个BookInstance状态字段值为“a”(可用)的对象列表。您可以在前面的教程 (Django Tutorial Part 3: Using models > Searching for records)中找到更多关于如何访问模型的信息。

- -

在函数结束时,我们将该函数称为render()创建和返回HTML页面作为响应(此快捷方式函数包含许多其他函数,简化了这种非常常见的用例)。它将原始request对象(an HttpRequest)作为参数,具有数据占位符的HTML模板以及context变量(包含要插入到这些占位符中的数据的Python字典)。

- -

我们将在下一节中详细介绍模板和上下文变量; 让我们创建我们的模板,以便我们可以向用户显示一些内容

- -

模版

- -

模版是定义一个文件(例如HTML页面)的结构与布局的文本文件,其中占位符用于表示实际内容。Django将自动在应用程序“templates”目录查找模版。所以例如,在我们刚刚加的索引页,render() 函数会期望能够找到/locallibrary/catalog/templates/index.html这个文件,如何找不到该文件,则会引发错误。如果保存以前的更改并返回到浏览器,你可以看到访问 127.0.0.1:8000 现在将提供你一个相当直观的错误信息"TemplateDoesNotExist at /catalog/“以及其他详细信息。

- -
-

注意: Django 将根据你的项目的设置文件, 来查看模版的许多位置 (在已安装的应用程序中进行搜索是默认设置). 你可以查阅更多关于Django如何找到模版以及它支持的模版格式在(Templates )。

-
- -

扩展模版

- -

索引模版将需要标准的HTML标记头部和正文,以及用于导航的部分(去我们尚为创建的网站其他的页面)以及显示一些介绍文本和我们书籍数据。我们网站上的每一页,大部分文字(HTML和导航结构)都是一样的。Django模版语言不是强制开发人员在每个页面中复制这个“样板”,而是让你声明一个基本模版,然后再扩展它,仅替换每个特定页面不同的位置。

- -

例如,基本模版 base_generic.html 可能看起来像下面的文本。正如你所见的,它包含一些“常见“HTML”和标题,侧边栏和使用命名 blockendblock 模版标记(粗体显示)标记的内容部分。块可以是空的,或者包含将被派生页“默认使用”的内容。

- -
-

注意: 模版标签就像你可以在模版中使用的函数循环列表,基于变量的值执行条件操作等。除了模版标签,模版语法允许你引用模版变量(通过从视图进入模版),并使用模版过滤器,其中重新格式化变量(例如,将字符串设置为小写)。

-
- -
<!DOCTYPE html>
-<html lang="en">
-<head>
-  {% block title %}<title>Local Library</title>{% endblock %}
-</head>
-
-<body>
-  {% block sidebar %}<!-- insert default navigation text for every page -->{% endblock %}
-  {% block content %}<!-- default content text (typically empty) -->{% endblock %}
-</body>
-</html>
-
- -

当我们要为特定视图定义一个模版时,我们首先指定基本模版(使用 extends 模版标签—查看下一个代码片段)。如果我们想要在模版中替换的章节,会使用相同的 block/endblock 部分在基本模版表明。

- -

例如,下面我们使用 extends 模版标签,并覆盖 content 块。生成的最终HTML页面将具有基本模版中定义的所以HTML和结构(包括你在title块中定义的默认内容),但你新的 content 块插入到了默认的那块。

- -

base_generic.html 详细会在下文中,请耐心往下看。

- -
{% extends "base_generic.html" %}
-
-{% block content %}
-<h1>Local Library Home</h1>
-<p>Welcome to <em>LocalLibrary</em>, a very basic Django website developed as a tutorial example on the Mozilla Developer Network.</p>
-{% endblock %}
- -

本地图书馆-基本模版

- -

下面就是我们计划的基本模版用于本地图书馆网站。正如所看到的,内容包括一些HTML和定义块 titlesidebarcontent。我们有默认的 title(当然我们可以改)和默认的所以书籍和作者的链接列表 sidebar (我们可能并不会怎么改,但需要时,我们通过把想法放入块block中,比如想法是—允许范围)。

- -
-

注意: 我们再介绍两个额外的模版标签: urlload static 。下文中我们会详细介绍。

-
- -

创建一个新的文件 — /locallibrary/catalog/templates/base_generic.html — 写入如下代码

- -
<!DOCTYPE html>
-<html lang="en">
-<head>
-
-  {% block title %}<title>Local Library</title>{% endblock %}
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
-  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
-  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
-
-  <!-- Add additional CSS in static file -->
-  {% load static %}
-  <link rel="stylesheet" href="{% static 'css/styles.css' %}">
-</head>
-
-<body>
-
-  <div class="container-fluid">
-
-    <div class="row">
-      <div class="col-sm-2">
-      {% block sidebar %}
-      <ul class="sidebar-nav">
-          <li><a href="{% url 'index' %}">Home</a></li>
-          <li><a href="">All books</a></li>
-          <li><a href="">All authors</a></li>
-      </ul>
-     {% endblock %}
-      </div>
-      <div class="col-sm-10 ">
-      {% block content %}{% endblock %}
-      </div>
-    </div>
-
-  </div>
-</body>
-</html>
- -

该模版使用(并包含)JavaScript 和  Bootstrap  (css框架)来改进HTML页面的布局和显示,这个框架或者另一个客户端网络框架,这是快速创建一个可用页面来适应在不同浏览器尺寸和允许我们处理页面呈现且不用一点细节—我们只需要专注在服务器端。

- -

基本模版还引用了一个本地css文件 (styles.css) ,它提供了一些额外的样式。 新建 /locallibrary/catalog/static/css/styles.css 如下:

- -
.sidebar-nav {
-    margin-top: 20px;
-    padding: 0;
-    list-style: none;
-}
- -

索引模版

- -

新建HTML文件 /locallibrary/catalog/templates/index.html 写入下面代码。第一行我们扩展了我们的基本模版, 使用 content替换默认块。

- -
{% extends "base_generic.html" %}
-
-{% block content %}
-<h1>Local Library Home</h1>
-
-  <p>Welcome to <em>LocalLibrary</em>, a very basic Django website developed as a tutorial example on the Mozilla Developer Network.</p>
-
-<h2>Dynamic content</h2>
-
-  <p>The library has the following record counts:</p>
-  <ul>
-    <li><strong>Books:</strong> \{{ num_books }}</li>
-    <li><strong>Copies:</strong> \{{ num_instances }}</li>
-    <li><strong>Copies available:</strong> \{{ num_instances_available }}</li>
-    <li><strong>Authors:</strong> \{{ num_authors }}</li>
-  </ul>
-
-{% endblock %}
- -
-

注意:由于本网站就是通过django 来运维,\{{ 的模版标签 在上面代码中会运行,只能通过增加 \ 来转义,而不能直接写出“双大括号”。

-
- -

在动态内容部分,我们的占位符(模版变量),是给我们想要视图的信息声明。变量使用“双大括号“ 或者“句柄“语法进行标记。

- -
-

注意: 你可以轻松地识别是否使用变量或模版标签(函数),因为变量具有双括号(\{{ num_books }}) 而标记被包含在带有百分比符号 ({% extends "base_generic.html" %})的单个大括号中。

-
- -

这里要注意的重要事情是这些变量用我们视图函数render中的字典—注入 context (下面);当渲染模版时,这些将替换为相关联的值。

- -
return render(
-    request,
-    'index.html',
-     context={'num_books':num_books,'num_instances':num_instances,'num_instances_available':num_instances_available,'num_authors':num_authors},
-)
- -

在模版中引用静态文件

- -

你的项目可能会使用静态资源,包括javascriptcss 和图像。由于这些文件的位置可能不知道(或者可能会发生变化),则Django允许你指定你的模版相对于这些文件的位置 STATIC_URL 全局设置(默认基本网站设置的值 STATIC_URL,以“/static/”,但你可能选择在CDN和其他地方托管内容)。

- -

在模版中,你首先调用 load 指定“ static”去添加此模版库(如下)。静态加载后,你可以使用 static 模版标签,指定感兴趣的文件相对URL

- -
 <!-- Add additional CSS in static file -->
-{% load static %}
-<link rel="stylesheet" href="{% static 'css/styles.css' %}">
- -

你可以用同样的方式将图像添加到页面中:

- -
{% load static %}
-<img src="{% static 'catalog/images/local_library_model_uml.png' %}" alt="My image" style="width:555px;height:540px;"/>
-
- -
-

主题: 上面的更改指定文件所在的位置,但Django默认不提供它们。当我们created the website skeleton,我们在全局URL映射器r (/locallibrary/locallibrary/urls.py) 中开发Web服务器提供服务,你仍然需要安排它们在生产中投放。我们接下来看一看

-
- -

更多内容—Managing static files (Django docs).

- -

链接URLs

- -

基本的模版引入 url 模版标签

- -
<li><a href="{% url 'index' %}">Home</a></li>
-
- -

此标记url()使用您的urls.py中调用的函数的名称 和相关视图将从该函数接收的任何参数的值,并返回可用于链接到该资源的URL。

- -

它看起来什么样?

- -

运行 (python3 manage.py runserver) 和在浏览器中打开 http://127.0.0.1:8000/. I如果一切都正确设置,当当当当。

- -

Index page for LocalLibrary website

- -
-

注意:由于尚未定义这些网页的网址,视图和模板,因此您将无法使用“ 所有图书所有作者”链接(目前我们刚刚在base_generic.html模板中插入了这些链接的占位符

-
- -

挑战自己

- -

以下是一些测试您熟悉模型查询,视图和模板的任务。

- -

   1. 在索引模板中声明一个新的标题块,并更改页面标题以匹配此特定页面。
-    2. 修改视图以生成包含特定单词(不区分大小写)的类型计数和书数,然后将这些字段添加到模板。

- - - -

概要

- -

我们现在已经为我们的网站创建了主页 - 一个HTML页面,显示数据库中的一些记录数,并且链接到我们其他尚待创建的页面。一路上,我们已经学到了很多有关url映射器,视图,使用我们的模型查询数据库的基本信息,如何从您的视图传递信息到模板,以及如何创建和扩展模板。

- -

在我们的下一篇文章中,我们将基于我们的知识来创建其他四个页面。

- -

也可以看看

- - - -

{{PreviousMenuNext("Learn/Server-side/Django/Admin_site", "Learn/Server-side/Django/Generic_views", "Learn/Server-side/Django")}}

diff --git "a/files/zh-cn/learn/server-side/django/\345\274\200\345\217\221\347\216\257\345\242\203/index.html" "b/files/zh-cn/learn/server-side/django/\345\274\200\345\217\221\347\216\257\345\242\203/index.html" deleted file mode 100644 index fb6041621f..0000000000 --- "a/files/zh-cn/learn/server-side/django/\345\274\200\345\217\221\347\216\257\345\242\203/index.html" +++ /dev/null @@ -1,406 +0,0 @@ ---- -title: 设置Django开发环境 -slug: learn/Server-side/Django/开发环境 -tags: - - Python - - django -translation_of: Learn/Server-side/Django/development_environment ---- -
{{LearnSidebar}}
- -
{{PreviousMenuNext("Learn/Server-side/Django/Introduction", "Learn/Server-side/Django/Tutorial_local_library_website", "Learn/Server-side/Django")}}
- -

现在,你知道什么是Django。
- 那么我们将向你展示如何在Windows,Linux(Ubuntu)和 Mac OSX上设置和测试Django开发环境—无论你常用哪种操作系统,本文能给你开发Django应用所需的一切。

- - - - - - - - - - - - -
先决条件:知道如何在你开发所用的计算机操作系统中,打开终端/命令行和安装软件包。
目的:在你的计算机中运行Django(1.10)开发环境。
- -

Django 开发环境概述

- -

Django 使你可以轻松配置自己的电脑,以便开始开发网络应用。本节解释您可以从开发环境中获得什么,并提供一些设置和配置选项的概述。本文的其余部分介绍了在UbuntuMac OSX和Windows上安装Django开发环境的 推荐方法,以及如何测试。

- -

什么是Django开发环境?

- -

开发环境是本地计算机上的Django安装,在将Django应用程序部署到生产环境之前,您可以使用它来开发和测试Django应用程序。

- -

Django 本身提供的主要工具是一组用于创建和使用Django项目的Python脚本,以及可在你电脑的web 浏览器中测试本地Django web应用(在你的计算机,而不是在外部的web 服务器)。

- -

还有其他外部工具, 它们构成了开发环境的一部分, 我们将不再赘述。这些包括 文本编辑器 或编辑代码的IDE,以及像 Git 这样的源代码控制管理工具,用于安全地管理不同版本的代码。我们假设你已经安装了一个文本编辑器。

- -

什么是Django设置选项?

- -

Django 在安装和配置方面非常灵活。Django可以:

- - - -

每个选项都需要略微不同的配置和设置。以下小节解释了你的一些选择。在本文的其余部分中,我们将介绍Django在几个操作系统上的设置,并且在本教程的剩余模块中将假设你已进行该设置。

- -
-

注意: 其他可能的安装选项在官方Django文档中介绍。相应文件 点击这里.

-
- -

支持哪些操作系统?

- -

Django web应用程序能运行在几乎任何可以运行Python3的计算机上:Windows,Mac OSX,Linux/Unix,Solaris,仅举几例。几乎任何计算机都具备在开发期间运行Django所需的性能。

- -

在本文中。我们将提供Windows,macOS 和Linux/Unix的说明。

- -

你应该使用什么版本的Python?

- -

我们建议你使用最近发行的版本,在本文档写作的时候是Python 3.8.2。

- -

事实上,Python 3.5 以及更新的版本都可以用来开发,不过对Python 3.5的支持可能会在未来的版本更新中被移除。

- -

我们建议你使用最新版本的Python 3,除非该站点依赖于仅适用于Python 2 的第三方库。本文将介绍如何为Python 3安装环境(Python 2 的等效设置将非常相似)。

- - - -
-

注意: Python 2.7 无法用于当前的 Django 发行版本(Django 1.11.x 系列是最后支持 Python 2.7 的版本)。

-
- -

我们在哪里下载Django?

- -

有三个地方可以下载Django:

- - - -

本文介绍如何从PyPi安装Django的最新稳定版本。

- -

哪个数据库?

- -

Django支持四个主要数据库(PostgreSQL,MySQL,Oracle和SQLite),还有一些社区库可以为其他流行的SQL和NOSQL数据库提供不同级别的支持。我们建议你为生产和开发选择相同的数据库(尽管Django使用其对象关系映射器(ORM)抽象了许多数据库之间的差异,但是仍然存在本可以避免的潜在问题 ).

- -

对于本文(和本模块的大部分),我们将使用将数据存储在文件中的SQLite数据库。SQLite旨在用作轻量级数据库,不能支持高并发。然而,这确实是只读的应用程序的绝佳选择。

- -
-

注意:当你使用标准工具(django-admin)启动你的网站项目时,Django将默认使用SQLite。用来入门时,这是一个很好的选择,因为它不需要额外的配置和设置。

-
- -

安装本机系统还是Python虚拟环境中?

- -

当你安装Python3时,将获得一个由所有Python3代码共享的全局环境。虽然你可以在该环境中安装任何你喜欢的Python包,但是每次只能安装每个包的一个特定版本。

- -
-

注意:安装到全局环境的Python应用程序可能会相互冲突(例如如果它们依赖于同一包的不同版本)。

-
- -

如果你把Django安装到默认/全局环境中,那么在该计算机上将只能定位到Django的一个版本。如果你想创建新的网站(使用最新版本的Django),同时仍然维护依赖旧版本的网站,这可能是个问题。

- -

因此,经验丰富的Python/Django开发人员通常在独立Python虚拟环境中运行Python应用程序。这样就可以在一台计算机上实现多个不同的Django环境。Django开发团队同样建议你使用Python虚拟环境。

- -

本模块假设已经将Django安装到虚拟环境中,下面我们会演示如何进行。

- -

安装 Python 3

- -

为了使用Django,你需要在你的操作系统中安装Python。如果你使用Python3,那么你同样需要Python 包管理工具  — pip3 — 用来管理 (安装,更新和删除)被Django和其他Python应用程序使用的Python软件包/库。

- -

本节简要介绍了如何检查有哪些版本的Python,并根据需要安装适用于 Ubuntu Linux 16.04,macOS, and Windows 10的新版本。

- -
-

注意: 根据你的平台, 您还可以从操作系统自己的软件包管理器或其他机制安装Python / pip。对于大多数平台,您可以从https://www.python.org/downloads/下载所需的安装文件,并使用该平台特定的方法进行安装。

-
- -

Ubuntu 18.04

- -

Ubuntu Linux 18.04 LTS默认包含Python 3.6.6。你可以通过在Bash终端中运行以下命令来确认这一点:

- -
python3 -V
- Python 3.6.6
- -

然而,在默认情况下,为Python 3(包括Django)安装软件包的Python包管理工具不可用。你可以在bash终端中使用以下命令安装pip3

- -
sudo apt-get install python3-pip
-
- -

macOS

- -

macOS 的"El Capitan" 及其他最新版本不包含Python 3。你可以通过在bash终端中运行一下命令来确认:

- -
python3 -V
- -bash: python3: command not found
- -

你可以轻松地从 python.org安装Python 3(以及pip3工具):

- -
    -
  1. 下载所需的安装程序: -
      -
    1. 点击 https://www.python.org/downloads/
    2. -
    3. 选择 Download Python 3.8.2  (具体的版本号可能不同)。
    4. -
    -
  2. -
  3. 使用Finder找到安装包,然后双击运行,并按照提示进行安装。
  4. -
- -

之后可以通过检查Python3版本确认是否安装成功,如下所示:

- -
python3 -V
-Python 3.8.2
- -

你也可以通过列出可用的包来检查pip3是否安装了:

- -
pip3 list
- -

Windows 10

- -

windows默认不包含Python, 但你可以从 python.org轻松地安装它(以及pip3工具):

- -
    -
  1. 下载所需版本: -
      -
    1. 点击 https://www.python.org/downloads/
    2. -
    3. 选择 Download Python 3.8.2  (具体的版本号可能不同)。
    4. -
    -
  2. -
  3. 双击现在的文件并按照提示安装Python。
  4. -
  5. 确保勾选了"Add Python to PATH"选项。
  6. -
- -

你可以在命令提示符中输入以下内容来验证是否安装了Python:

- -
python -V
- Python 3.8.2
-
- -

Windows安装程序默认包含pip3 (Python包管理器)。同样在命令提示符中输入以下内容来列出已安装的包:

- -
pip3 list
-
- -
-

注意:安装包应该已把运行上述命令所需的一切设置完成。但如果你得到的消息是找不到Python,那么你可能忘记将Python添加到系统路径中了。你可以通过再次运行安装包,选择"Modify",并在下一页面中勾选 "Add Python to environment variables"来修复这个问题。

-
- -

在Python虚拟环境中使用Django

- -

我们使用virtualenvwrapper(Linux及macOS)和 virtualenvwrapper-win(WIndows)来创建Python虚拟环境,而它们又使用了virtualenv。封装工具创建了一个一致的接口来管理各个平台上的接口。

- -

安装虚拟环境软件

- -

Ubuntu虚拟环境设置

- -

安装了Python和pip之后,你就可以安装virtualenvwrapper(包括了virtualenv)。可以在这里找到正式的安装指南,或按照以下指导操作。

- -

使用pip3安装该工具:​​​​​​

- -
sudo pip3 install virtualenvwrapper
- -

然后将以下代码行添加到shell启动文件的末尾(这是主目录中的一个隐藏文件,名字是.bashrc)。这些文件设置了虚拟环境应该存在的位置、开发项目目录的位置以及与这个包一起安装的脚本的位置。

- -
export WORKON_HOME=$HOME/.virtualenvs
-export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
-export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
-export PROJECT_HOME=$HOME/Devel
-source /usr/local/bin/virtualenvwrapper.sh
- -
-

注意:VIRTUALENVWRAPPER_PYTHON 和 VIRTUALENVWRAPPER_VIRTUALENV_ARGS变量指向Python3的常规安装位置,source /usr/local/bin/virtualenvwrapper.sh指向virtualenvwrapper.sh脚本的一般安装位置。 如果您在测试时发现virtualenv无法正常工作,则要检查的一件事是Python和该脚本是否在预期的位置(然后适当更改启动文件)。

- -

你可以使用which virtualenvwrapper.sh 和 which python3命令为你的系统找到正确的安装位置。

-
- -

然后通过在终端中运行以下命令重载启动文件:

- -
source ~/.bashrc
- -

此时,你应该能看到一些脚本正在运行,如下所示:

- -
virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/premkproject
-virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postmkproject
-...
-virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/preactivate
-virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/postactivate
-virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/get_env_details
- -

然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

- -

macOS 虚拟环境设置

- -

在macOS上设置virtualenvwrapper 几乎和在Ubuntu上是一样的(你同样可以按照以下指导操作,或在这里找到正式的安装指南)。

- -

使用pip安装virtualenvwrapper(并绑定virtualenv),如下所示。

- -
sudo pip3 install virtualenvwrapper
- -

然后将以下代码行添加到shell启动文件的末尾:

- -
export WORKON_HOME=$HOME/.virtualenvs
-export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
-export PROJECT_HOME=$HOME/Devel
-source /usr/local/bin/virtualenvwrapper.sh
- -
-

注意:VIRTUALENVWRAPPER_PYTHON 和 VIRTUALENVWRAPPER_VIRTUALENV_ARGS变量指向Python3的常规安装位置,source /usr/local/bin/virtualenvwrapper.sh指向virtualenvwrapper.sh脚本的一般安装位置。 如果您在测试时发现virtualenv无法正常工作,则要检查的一件事是Python和该脚本是否在预期的位置(然后适当更改启动文件)。

- -

例如,在macOS上的一个安装测试中,启动文件中必须有以下几行代码:

- -
export WORKON_HOME=$HOME/.virtualenvs
-export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.7/bin/python3
-export PROJECT_HOME=$HOME/Devel
-source /Library/Frameworks/Python.framework/Versions/3.7/bin/virtualenvwrapper.sh
- -

你可以使用which virtualenvwrapper.sh 和 which python3命令为你的系统找到正确的安装位置。

-
- -

此处使用和Ubuntu相同的代码行,但是启动文件是主目录中叫做.bash_profile的隐藏文件。

- -
-

注意:如果找不到.bash_profile进行编辑,也可以使用nano在终端中打开它,命令看起来类似于:

- -
cd ~  # Navigate to my home directory
-ls -la #List the content of the directory. YOu should see .bash_profile
-nano .bash_profile # Open the file in the nano text editor, within the terminal
-# Scroll to the end of the file, and copy in the lines above
-# Use Ctrl+X to exit nano, Choose Y to save the file.
-
- -

然后通过在终端中运行以下命令重载启动文件:

- -
source ~/.bashrc
- -

此时,你应该能看到一些脚本正在运行(和Ubuntu中同样的脚本)。然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

- -

Windows 10 虚拟环境设置

- -

安装 virtualenvwrapper-win 甚至比设置virtualenvwrapper 更简单,因为你无需配置工具用来存储虚拟环境信息的位置(有一个默认值)。你需要做的只是在命令提示符中运行以下命令:

- -
pip3 install virtualenvwrapper-win
- -

然后你就可以使用 mkvirtualenv命令创建一个新的虚拟环境。

- -

创建虚拟环境

- -

一旦你成功安装了virtualenvwrapper 或 virtualenvwrapper-win,那么在所有平台中使用虚拟环境的方法是非常相似的。

- -

现在你可以使用 mkvirtualenv命令创建一个新的虚拟环境。在运行此命令时,你将看到正在设置的环境(你所看到的只略微与平台相关)。命令完成后,新的虚拟环境将被激活——你能看到提示符的开头就是括号中的环境名称(以下我们展示的是Ubuntu的,但是在Windows/macOS上,末行时相似的|)

- -
$ mkvirtualenv my_django_environment
-
-Running virtualenv with interpreter /usr/bin/python3
-...
-virtualenvwrapper.user_scripts creating /home/ubuntu/.virtualenvs/t_env7/bin/get_env_details
-(my_django_environment) ubuntu@ubuntu:~$
- -

现在你已进入虚拟环境,可以进行Django安装并开始开发。

- -
-

注意:从现在开始,在本文(实际上是该模块)中,请假定所有命令都在类似于我们上面设置的Python虚拟环境中运行。

-
- -

使用一个虚拟环境

- -

您应该知道一些其他有用的命令(在工具的文档中还有更多,但这些是您将经常使用的命令):

- - - -
- -

安装Django

- -

一旦你创建了一个虚拟环境,并且使用workon 进入了它,就可以使用pip3来安装Django。

- -
pip3 install django
- -

您可以通过运行以下命令来测试Django是否安装(这只是用来测试Python是否可以找到Django模块):

- -
# Linux/macOS
-python3 -m django --version
- 1.10.10
-
-# Windows
-py -3 -m django --version
- 1.10.10
-
- -
-

注意如果上面的Windows命令没有显示django模块,请尝试:

- -
py -m django --version
- -

在Windows中,Python 3脚本是通过在命令前面加上py -3来启动的,尽管该脚本可能会因您的特定安装而有所不同。 如果遇到命令问题,请尝试省略-3修饰符。 在Linux /macOS中,命令是python3。

-
- -
-

重要提示:本模块的其余部分使用Linux命令来调用Python 3(python3)。如果您在Windows上工作,只需将此前缀替换为: py -3

-
- -

测试你的安装

- -

上面的测试工作并不是很有趣。一个更有趣的测试是创建一个框架项目并查看它的工作情况。要做到这一点,先在你的命令提示符/终端导航到你想存储你Django应用程序的位置。为您的测试站点创建一个文件夹并进入其中。

- -
mkdir django_test
-cd django_test
-
- -

然后,您可以像所展示的一样使用django-admin工具创建一个名为“ mytestsite ” 的新框架站点。创建网站后,您可以CD到此文件夹,并将在其中找到管理项目的主要脚本,名为manage.py

- -
django-admin startproject mytestsite
-cd mytestsite
- -

我们可以在这个文件夹中使用manager.pyrunserver命令运行开发web服务器,如下所示。

- -
$ python3 manage.py runserver
-Performing system checks...
-
-System check identified no issues (0 silenced).
-
-You have 15 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.
-
-December 16, 2018 - 07:06:30
-Django version 2.2.12, using settings 'mytestsite.settings'
-Starting development server at http://127.0.0.1:8000/
-Quit the server with CONTROL-C.
- -
-

注意:上面的命令显示了Linux /macOS命令。您可以忽略关于“15 unapplied migration(s)”的警告!

-
- -

一旦服务器运行,您可以通过本地Web浏览器打开http://127.0.0.1:8000/来查看该站点。你应该看到一个如下所示的网站:

- -

The home page of the skeleton Django app.

- - - -

概要

- -

现在,你的计算机中已经启动并运行了一个Django开发环境。

- -

在测试部分,您还简要地了解了如何使用django -admin startproject创建一个新的Django网站,并使用开发web服务器(python3 manager .py runserver)在浏览器中运行它。在下一篇文章中,我们将对此过程进行扩展,构建一个简单但完整的web应用程序。

- -

看看瞧瞧

- - - -

{{PreviousMenuNext("Learn/Server-side/Django/Introduction", "Learn/Server-side/Django/Tutorial_local_library_website", "Learn/Server-side/Django")}}

diff --git "a/files/zh-cn/learn/server-side/django/\347\256\241\347\220\206\347\253\231\347\202\271/index.html" "b/files/zh-cn/learn/server-side/django/\347\256\241\347\220\206\347\253\231\347\202\271/index.html" deleted file mode 100644 index d3252d84c5..0000000000 --- "a/files/zh-cn/learn/server-side/django/\347\256\241\347\220\206\347\253\231\347\202\271/index.html" +++ /dev/null @@ -1,339 +0,0 @@ ---- -title: 'Django Tutorial Part 4: Django 管理员站点' -slug: learn/Server-side/Django/管理站点 -translation_of: Learn/Server-side/Django/Admin_site ---- -
{{LearnSidebar}}
- -
{{PreviousMenuNext("Learn/Server-side/Django/Models", "Learn/Server-side/Django/Home_page", "Learn/Server-side/Django")}}
- -

好了,我们已经为本地图书馆网站 LocalLibrary 创建了模型,我们接下来使用 Django 管理站点去添加 一些 “真“书数据。首先我们展示如何用管理站点注册模型,然后展示如何登录和创建一些数据。本文最后,我们介绍你可以进一步改进管理站点的建议。

- - - - - - - - - - - - -
前提:完成: Django Tutorial Part 3: 使用模型
目的: -

了解关于管理站点的优点与缺点,并且可以使用它为我们模型创建一些记录。

-
- -

综述

- -

Django管理应用程序可以使用您的模型自动构建可用于创建,查看,更新和删除记录的站点区域。这可以在开发过程中节省大量的时间,从而很容易测试您的模型,并了解您是否拥有正确的数据。根据网站的类型,管理应用程序也可用于管理生产中的数据。Django项目建议仅用于内部数据管理(即仅供管理员或组织内部人员使用),因为以模型为中心的方法不一定是所有用户最好的界面,并且暴露了大量不必要的细节关于模型。

- -

创建基础项目时,自动完成所有将您的网站中的管理应用程序包含在内的配置文件 (有关所需实际依赖关系的信息  (如有需要请看 Django docs here). 其结果是,你必须做你的模型添加到管理应用程序是  注册  他们。在本文末尾,我们将简要介绍如何进一步配置管理区域以更好地显示我们的模型数据。

- -

注册模型后,我们将展示如何创建一个新的“超级用户”,登录到该网站,并创建一些书籍,作者,书籍实例和流派。这些将有助于测试我们将在下一个教程中开始创建的视图和模板。

- -

注册模型

- -

首先,在目录应用程序(/locallibrary/catalog/admin.py)中打开 admin.py 。此时此刻它看起来像这样—注意它已经导入了django.contrib.admin:

- -
from django.contrib import admin
-
-# Register your models here.
-
- -

通过将以下文本复制到文件的底部来注册模型。该代码简单地导入模型,调用 admin.site.register 来注册它们。

- -
from .models import Author, Genre, Book, BookInstance
-
-admin.site.register(Book)
-admin.site.register(Author)
-admin.site.register(Genre)
-admin.site.register(BookInstance)
-
- -
注意: 如果你接受创建模型以表示书籍的自然语言的挑战(see the models tutorial article), 导入并注册。
- -

这是在网站上注册模型或多模型的简单方法,管理站点是高度可定制的,我们将进一步讨论注册模型的其他方式。

- -

创建一个超级用户

- -

为了登录管理员站点,我们需要启动工作人员状态的用户账户。为了查看和创建记录,我们还需要该用户具有所有对象的记录。你可以创建一个“超级用户”账号,该账号具有完全访问该站点和所有必需的权限可以使用manage.py

- -

调用接下来的命令,在同样的目录下,manage.py 创建超级用户。你将被提示输入用户名,电子邮件地址,和强密码。

- -
python3 manage.py createsuperuser
-
- -

一旦命令完成,一个新超级用户将被添加到数据库。现在重新启动开发服务器,以便我们可以测试登录名:

- -
python3 manage.py runserver
-
- -

登入并使用该网站

- -

登录网站,打开 /admin (e.g. http://127.0.0.1:8000/admin)
- 和进入你的新超级用户名和密码凭据(你将被重定向到 登录页面,然后在你进入你的详细信息后回到 /admin URL

- -

这部分网站展示我们所有的模型,按安装的应用程序分组。你可以点击模型名称来进入到 它所有相关详细记录的页面,你可以进一步点击这些记录进行编辑。你也可以直接点击每个模型旁边的添加链接,开始创建该类型的记录。

- -

Admin Site - Home page

- -

点击图书右侧的添加链接来新建一本书(这将显示一个类似下面的对话框)。注意每个字段标题,使用的小部件的类型以及help_text(如果有的话)你要在模型中匹配指定的值。

- -

输入字段的值,你可以创建一个新的作者或类型通过 按 + 按钮(或者如果你已经创建选项,选择已有的值)。完成后,你可以按 保存保存并添加另一个,或保存并继续编辑来保存记录。

- -

Admin Site - Book Add

- -
-

注意: 在这里,我们希望你花费一点时间添加一些书,作者,类型(如: 幻想)到你的应用。确保每个作者和类型都包含几本不同的书籍(这会是你的列表和详细视图在文章系列中后期使用时更有趣)。

-
- -

我们完成添加书籍,在顶部标签中,点击 Home 链接将回到主管理页面。然后点击 Books 链接显示当前书籍的列表(或其他链接之一,以查看其他型号列表)。现在你已经添加了几本书,列表可能与下面的截图类似。显示每本书的标题;这是书模型 __str__() 方法返回的值,在上一文章中提到。

- -

Admin Site - List of book objects

- -

从该列表中,您可以通过选中不需要的图书旁边的复选框来删除图书,从“ 操作”下拉列表中选择“ 删除”操作  ,然后按Go按钮。您也可以通过按下ADD BOOK按钮添加新书。

- -

您可以通过在链接中选择其名称来编辑书籍。一本书的编辑页面如下所示,与“添加”页面几乎相同。主要的区别是页面标题(更改书)和添加  删除,历史和VIEW ON SITE按钮(最后一个按钮出现,因为我们定义了get_absolute_url()我们的模型中的  方法)。

- -

Admin Site - Book Edit

- -

现在回到主页(使用主页链接的导航痕迹),然后查看作者  和类型  列表 - 您应该已经有很多创建从添加新书,但可以自由添加一些更多。

- -

你不会有任何书籍实例,因为这些不是从图书创建的(虽然你可以从 BookInstance - 创建一个书  - 这是ForeignKey字段的性质)。返回主页,然后按关联的添加按钮显示下面的添加书实例屏幕。请注意,全球唯一的ID,可用于单独标识库中单书的副本。

- -

Admin Site - BookInstance Add

- -

为你的书创建一些记录。将状态设置为可用于至少一些记录,并为其他记录贷款。如果状态 不可 用,则还设置未来到期日期。

- -

而已!您现在已经学会了如何 设置和使用管理站点。您还创建书的记录,BookInstance,Genre,和Author 我们就可以一次我们创造我们自己的观点和模板使用。

- -

高级配置

- -

Django 使用注册模型的信息为创建基本管理站点做了非常好的工作:

- - - -

你可以进一步自定义界面,使它更容易使用,你可以改进的一些想法:

- - - -

在本节中,我们将看一些改进本地图书馆界面的更改,其中包括添加更多信息Book和Author 模型列表,以及改进编辑视图的布局。我们不会改变 Language 和 Genre 模拟演示,因为它们只有一个字段,所以这样没有真正的好处。

- -

你可以 在The Django Admin site 中找到所以管理员网站自定义选项的完整参考。

- -

注册 一个 ModelAdmin 类

- -

在管理界面去改变一个模型的展示方式,当你定义了 ModelAdmin 类(描述布局)和将其注册到模型中。

- -

让我们开始作者模型。打开 admin.py 在目录应用程序(/locallibrary/catalog/admin.py)。注释你的原始注册(前缀为#)在 Author 模型

- -
# admin.site.register(Author)
- -

现在添加一个 AuthorAdmin 和注册,如下

- -
# Define the admin class
-class AuthorAdmin(admin.ModelAdmin):
-    pass
-
-# Register the admin class with the associated model
-admin.site.register(Author, AuthorAdmin)
-
- -

我们再为Book 添加 ModelAdmin 类 和 BookInstance 类。我们需要注释我们原始注册:

- -
#admin.site.register(Book)
-#admin.site.register(BookInstance)
- -

现在创建和注册新的模型;为了演示的目的,我们将使用@register 装饰器来注册模型(这和 admin.site.register() 语法作用一样)。

- -
# Register the Admin classes for Book using the decorator
-
-@admin.register(Book)
-class BookAdmin(admin.ModelAdmin):
-    pass
-
-# Register the Admin classes for BookInstance using the decorator
-
-@admin.register(BookInstance)
-class BookInstanceAdmin(admin.ModelAdmin):
-    pass
-
- -

可以看到我们现在 的 类都是空的 (“pass”),所以管理操作并不会改变,我们现在对这些类进行扩展,以定义我们针对模型的管理行为。

- -

配置列表视图

- -

该 本地图书馆 目前列出的所以作者都使用从模型生成的对象名称的__str__() 方法。如果只是几个作者,这无关紧要。但一旦你有许多作者,这可能会重复。要区分它们,或仅仅因为你想要显示有关每个作者的更多有趣的信息,你可以使用list_display 向视图添加其他字段。

- -

用下面的代码替代 你 AuthorAdmin 的类。在元组中声明要显示列表中的字段名称以所需的顺序排列,如图(这些和原始模型中指定的名称相同)。

- -
class AuthorAdmin(admin.ModelAdmin):
-    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
-
- -

重新启动站点并导航到作者列表。现在应该显示上述字段,如下所示:

- -

Admin Site - Improved Author List

- -

对于我们的Book模型,我们将另外显示authorgenre。这author是一个ForeignKey字段(一对多)的关系,所以将由__str()__相关记录的值表示。用BookAdmin下面的版本替换课程。

- -
class BookAdmin(admin.ModelAdmin):
-    list_display = ('title', 'author', 'display_genre')
-
- -

不幸的是,我们不能直接指定 list_display 中的 genre 字段, 因为它是一个ManyToManyField (Django可以防止这种情况,因为在这样做时会有大量的数据库访问“成本”)。相反,我们将定义一个 display_genre 函数来获取信息作为一个字符串(这是我们上面调用的函数;下面我们将定义它)。

- -
-

注意:在genre这里获取可能不是一个好主意,因为数据库操作的“成本”。我们向您展示了如何在模型中调用函数的其他原因非常有用 - 例如在列表中的每个项目旁边添加一个“ 删除”链接。

-
- -

将以下代码添加到Book模型(models.py)中。这将从 genre字段的前三个值(如果存在)创建一个字符串,并创建一个short_description可以在此方法的管理站点中使用的字符串。

- -
    def display_genre(self):
-        """
-        Creates a string for the Genre. This is required to display genre in Admin.
-        """
-        return ', '.join([ genre.name for genre in self.genre.all()[:3] ])
-    display_genre.short_description = 'Genre'
-
- -

保存模型并更新管理员后,重新启动站点并转到图书列表页面; 你应该看到像下面这样的书籍清单:

- -

Admin Site - Improved Book List

- -

该Genre模型(和Language模式,如果你定义一个)都有一个单一的领域,所以没有一点为他们创造更多的显示领域的附加模型。

- -
-

注意:值得更新BookInstance模型列表,至少显示状态和预期的返回日期。我们已经补充说,作为本文末尾的挑战!

-
- -

添加列表过滤器

- -

一旦列表中有很多项目,就可以过滤哪些项目被显示出来。这是通过在list_filter属性中列出字段来完成的。用BookInstanceAdmin下面的代码片段替换你当前的  类。

- -
class BookInstanceAdmin(admin.ModelAdmin):
-    list_filter = ('status', 'due_back')
-
- -

列表视图现在将在右侧包含一个过滤器框。请注意如何选择日期和状态来过滤值:

- -

Admin Site - BookInstance List Filters

- -

整理细节视图布局

- -

默认情况下,详细视图按照其在模型中声明的顺序垂直排列所有字段。您可以更改声明的顺序,哪些字段显示(或排除),区段是否用于组织信息,字段是水平还是垂直显示,甚至是管理窗体中使用的编辑窗口小部件。

- -
-

注意:LocalLibrary模型比较简单,因此我们不需要更改布局; 不管怎样,我们会做一些改变,只是为了向你展示如何。

-
- -

控制哪些字段被显示和布局

- -

更新您的  AuthorAdmin 类以添加fields行,如下所示(粗体):

- -
class AuthorAdmin(admin.ModelAdmin):
-    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
-    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
-
- -

fields 属性列表只是要显示在表格上那些领域,如此才能。字段默认情况下垂直显示,但如果您进一步将它们分组在元组中(如上述“日期”字段中所示),则会水平显示。

- -

重新启动您的应用程序并转到作者详细信息视图 - 现在应该如下所示:

- -

Admin Site - Improved Author Detail

- -
-

注意:您还可以使用exclude属性来声明要从表单中排除的属性列表(将显示模型中的所有其他属性)。

-
- -

剖切细节视图

- -

你可以使用 fieldsets 属性添加“部分”以在详细信息表单中对相关的模型信息进行分组。

- -

在  BookInstance模型中,我们有相关的书是什么(即信息  name,imprint和id),并且当将可用(status,due_back)。我们可以通过将粗体文本添加到我们的BookInstanceAdmin类中来将其添加到不同的部分  。

- -
@admin.register(BookInstance)
-class BookInstanceAdmin(admin.ModelAdmin):
-    list_filter = ('status', 'due_back')
-
-    fieldsets = (
-        (None, {
-            'fields': ('book','imprint', 'id')
-        }),
-        ('Availability', {
-            'fields': ('status', 'due_back')
-        }),
-    )
- -

每个部分都有自己的标题(或者None如果你不想要一个标题)和字典中的一个相关的元组 - 描述的格式很复杂,但是如果你看上面的代码片段,那么它们很容易理解。

- -

重新启动并导航到书籍实例视图; 表格应如下所示:

- -

Admin Site - Improved BookInstance Detail with sections

- -

关联记录的内联编辑

- -

有时,可以同时添加关联记录是有意义的。例如,将书籍信息和有关您在同一详细信息页面上的特定副本的信息同时显示可能是有意义的。

- -

你可以通过声明 inlines, 类型 TabularInline (水平布局 ) or StackedInline (垂直布局 ,就像默认布局)这样做. 您可以通过在您的以下的粗体中添加以下行,将内容中的BookInstance信息添加到我们的Book详细信息中BookAdmin

- -
class BooksInstanceInline(admin.TabularInline):
-    model = BookInstance
-
-@admin.register(Book)
-class BookAdmin(admin.ModelAdmin):
-    list_display = ('title', 'author', 'display_genre')
-    inlines = [BooksInstanceInline]
-
- -

尝试重新启动您的应用程序,然后查看图书的视图 - 在底部您应该看到与本书相关的图书实例:

- -

Admin Site - Book with Inlines

- -

在这种情况下,我们所做的就是声明我们的tablular内联类,它只是从内联模型添加所有字段。您可以为布局指定各种附加信息,包括要显示的字段,其顺序,是否只读等。(有关详细信息,请参阅  TabularInline ). 

- -
-

注意:这个功能有一些痛苦的限制!在上面的屏幕截图中,我们有三个现有的书籍实例,其次是新的书籍实例的三个占位符(看起来非常相似!)。默认情况下没有备用书实例会更好,只需使用“ 添加另一个书”实例链接添加它们,或者可以BookInstance从这里列出作为不可读的链接。第一个选项可以通过extraBookInstanceInline模型中将属性设置为0 来完成,自己尝试一下。

-
- -

挑战自己

- -

我们在本节学到了很多东西,所以现在是时候尝试一些事情了。

- -

1. 对于  BookInstance列表视图,添加代码以显示书籍,状态,到期日期和ID(而不是默认__str__()文本)。
- 2. 添加的在线上市Book项目的Author使用,因为我们做了同样的做法详细视图Book/ BookInstance。

- -

概要

- -

而已!您现在已经了解了如何以最简单和改进的形式设置管理站点,如何创建超级用户以及如何导航管理站点以及查看,删除和更新记录。一路上,您创建了一堆书籍,BookInstances,流派和作者,一旦我们创建了自己的视图和模板,我们就可以列出和展示。

- - - -

进阶阅读

- - - -

{{PreviousMenuNext("Learn/Server-side/Django/Models", "Learn/Server-side/Django/Home_page", "Learn/Server-side/Django")}}

-- cgit v1.2.3-54-g00ecf