codecamp

Django Tutorial Part 4: Django admin site

先决条件: 首先完成: Django教程第3部分:使用模型
目的: 了解Django管理网站的优点和局限性,并使用它为我们的模型创建一些记录。

概述

Django admin 应用程式 可以使用您的模型自动建立一个网站区域,您可以用来建立,查看,更新和删除记录。 这可以在开发过程中节省大量时间,使您可以轻松地测试模型,并了解是否拥有正确的数据。 管理应用程序还可用于在生产中管理数据,具体取决于网站的类型。 Django项目仅推荐它用于内部数据管理(即仅供管理员或组织内部人员使用),因为以模型为中心的方法不一定是所有用户最好的界面,并且暴露了大量不必要的细节 关于模型。

当您创建骨架项目(有关所需的实际依赖关系的信息,请参阅 href ="https://docs.djangoproject.com/en/1.10/ref/contrib/admin/"class ="external"> 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)
Note: If you accepted the challenge to create a model to represent the natural language of a book (see the models tutorial article), import and register it too!

这是向站点注册模型或模型的最简单方法。 管理网站是高度可自定义的,我们将更多地讨论注册您的模型的其他方法。

创建超级用户

为了登录管理网站,我们需要一个启用了职员状态的用户帐户。 为了查看和创建记录,我们还需要此用户具有管理所有对象的权限。 您可以使用 manage.py 创建一个"超级用户"帐户,该帐户具有对该网站的完全访问权限和所有需要的权限。

调用与 manage.py 相同目录中的以下命令,以创建超级用户。 系统将提示您输入用户名,电子邮件地址和 strong 密码。

python3 manage.py createsuperuser

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

python3 manage.py runserver

登录和使用网站

要登录网站,请打开 / admin 网址(例如 http://127.0。 0.1:8000 / admin ),然后输入新的超级用户用户ID和密码凭据(您将被重定向到登录页面,然后返回 / admin >输入您的详细信息后的网址)。

这部分网站显示所有我们的模型,按已安装的应用程序分组。 您可以单击模型名称转到列出其所有关联记录的屏幕,然后可以进一步单击这些记录以进行编辑。 您也可以直接点击每个模型旁边的添加链接,开始创建该类型的记录。

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

输入字段的值。 您可以按相应字段旁边的 + 按钮创建新作者或类型(如果您已经创建了新作者,则可以从列表中选择现有值)。 完成后,您可以按保存保存并添加其他保存并继续编辑来保存记录。

; width:841px;">

注意:此时,我们希望您花点时间将一些书籍,作者和类型(例如幻想)添加到您的应用程序中。 确保每个作者和类型包括几个不同的书(这将使您的列表和详细视图更有趣,当我们以后在文章系列中实施)。

添加完书籍后,点击顶部书签中的首页链接即可返回主管理页面。 然后点击图书链接以显示当前图书列表(或通过其他链接查看其他模型列表)。 现在您已添加了几本书,该列表可能与下面的屏幕截图类似。 显示每本书的标题; 这是我们在上一篇文章中指定的Book模型的 __ str __()方法中返回的值。

; width:1000px;">

从此列表中,您可以通过选中不需要的图书旁边的复选框,从操作下拉列表中选择 delete ... 然后按开始按钮。 您也可以按添加书按钮添加新书。

您可以通过在链接中选择其名称来编辑图书。 图书的编辑页面(如下所示)几乎与"添加"页面完全相同。 主要区别是网页标题(更改图书)以及添加删除 HISTORY 查看位置 按钮(最后一个按钮出现,因为我们在模型中定义了 get_absolute_url()方法)。

; width:841px;">

现在返回首页页面(使用首页链接面包屑链接),然后查看作者流派 >列表 - 您应该已经从添加新书时创建了很多,但随时可以添加一些。

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

; width:863px;">

为每本图书创建一些记录。 将状态设置为至少一些记录的可用,以及其他人的贷款 如果状态为 可用,则还要设置未来的到期日期日期。

而已! 您现在已经学会了如何设置和使用管理站点。 您还创建了 Book BookInstance Genre 作者的记录, 使用一旦我们创建自己的视图和模板。

高级配置

Django使用注册模型中的信息创建一个基本的管理网站做得很好:

  • Each model has a list of individual records, identified by the string created with the model's __str__() method, and linked to detail views/forms for editing. By default, this view has an action menu up the top that you can use to perform bulk delete operations on records.
  • The model detail record forms for editing and adding records contain all the fields in the model, laid out vertically in their declaration order.  

您可以进一步自定义界面,使其更易于使用。 您可以做的一些事情是:

  • List views: 
    • Add additional fields/information displayed for each record. 
    • Add filters to select which records are listed, based on date or some other selection value (e.g. Book loan status).
    • Add additional options to the actions menu in list views and choose where this menu is displayed on the form.
  • Detail views
    • Choose which fields to display (or exclude), along with their order, grouping, whether they are editable, the widget used, orientation etc.
    • Add related fields to a record to allow inline editing (e.g. add the ability to add and edit book records while you're creating their author record).

在本节中,我们将介绍一些改进,以改进我们的 LocalLibrary 接口,包括向 Book Author 添加更多信息 >模型列表,并改进其编辑视图的布局。 我们不会改变 Language Genre 模型表示,因为它们每个只有一个字段,所以没有真正的好处!

您可以在 Django管理网站中找到所有管理网站自定义选项的完整参考 (Django文档)。

注册ModelAdmin类

要更改模型在管理界面中的显示方式,请定义 ModelAdmin 类(描述布局)并将其注册到模型。

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

# 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 BookInstance 添加 ModelAdmin 类。 我们再次需要注释原始注册:

#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"),所以管理行为将保持不变! 我们现在可以扩展这些定义我们的特定于模型的管理行为。

配置列表视图

LocalLibrary 目前列出使用从 __ str __()方法生成的对象名称的所有作者。 这是很好,当你只有几个作者,但一旦你有很多,你可能最终有重复。 要区分它们,或者因为您想要显示每个作者的更有趣的信息,您可以使用 .admin.ModelAdmin.list_display"class ="external"> list_display 向视图添加其他字段。

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

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

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

; width:941px;">

对于我们的 Book 模型,我们还会显示作者 genre 作者是一个 ForeignKey 字段(一对一)关系,因此将由 __ str()__ 关联记录。 BookAdmin 类替换为以下版本。

@admin.register(Book)
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'    

保存模型并更新管理员后,请重新启动网站并转到图书列表页面; 您应该会看到一个类似下面的图书列表:

; width:947px;">

Genre 模型(和 Language 模型,如果您定义了一个)都有一个字段,因此没有必要创建一个额外的模型来显示其他字段。

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

添加列表过滤器

一旦列表中有很多项目,可以过滤显示的项目是非常有用的。 这是通过列出 list_filter 属性中的字段来完成的。 将以下代码段替换为当前的 BookInstanceAdmin 类。

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_filter = ('status', 'due_back')

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

整理详细视图布局

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

注意: LocalLibrary 模型相对简单,因此我们不需要更改布局; 我们会做一些改变,但是,只是为了告诉你如何。

Controlling which fields are displayed and laid out

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

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')]

字段属性仅列出将按顺序显示在表单上的字段。 默认情况下垂直显示字段,但如果您进一步将它们分组为一个元组,则会水平显示(如上面的"日期"字段所示)。

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

; width:928px;">

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

Sectioning the detail view

您可以使用 ModelAdmin.fieldsets"class ="external"> 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')
        }),
    )

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

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

; width:947px;">

内联编辑关联记录

有时,可以同时添加关联记录是有意义的。 例如,您可以在同一个详细信息页面上同时获取图书信息和有关特定副本的信息。

您可以通过声明内联 / a>,类型为 TabularInline >(水平布局)或 StackedInline >(垂直布局,就像默认的模型布局)。 您可以在 Book 详细信息中添加 BookInstance 信息,方法是在 BookAdmin

class BooksInstanceInline(admin.TabularInline):
    model = BookInstance

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')
    inlines = [BooksInstanceInline]

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

; width:937px;">

在这种情况下,我们所做的就是声明tablular内联类,它只是添加了内联模型中的所有字段。 您可以指定布局的所有其他附加信息,包括要显示的字段,它们的顺序,它们是否是只读的等。(参见 dev / ref / contrib / admin /#django.contrib.admin.TabularInline"class ="external"> TabularInline 了解更多信息)。

注意:此功能有一些痛苦的限制! 在上面的截图中,我们有三个现有的书实例,其次是三个占位符为新的书实例(看起来非常相似!)。 默认情况下最好没有备用图书实例,只需使用添加其他图书实例链接添加它们,或者只需将 BookInstance 列为非 可读链接,但不支持这两个选项。

挑战自己

我们在本节中学到了很多,所以现在是时候尝试几个东西。

  1. For the BookInstance list view, add code to display the book, status, due back date, and id (rather than the default __str__() text).
  2. Add an inline listing of Book items to the Author detail view using the same approach as we did for Book/BookInstance.

    概要

    而已! 您现在已经学习了如何以最简单和改进的形式设置管理站点,如何创建超级用户以及如何浏览管理站点以及查看,删除和更新记录。 一路上,你创建了一堆书,BookInstances,类型和作者,我们将能够列出和显示一旦我们创建自己的视图和模板。

    进一步阅读

    Assessment: DIY Django mini blog
    Django Tutorial Part 5: Creating our home page
    温馨提示
    下载编程狮App,免费阅读超1000+编程语言教程
    取消
    确定
    目录
    CSS

    关闭

    MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }