Django Tutorial Part 4: Django admin site

2018-05-15 17:26 更新
先決條件: 首先完成: Django教程第3部分:使用模型。
目的: 了解Django管理網(wǎng)站的優(yōu)點和局限性,并使用它為我們的模型創(chuàng)建一些記錄。

概述

Django admin 應用程式 可以使用您的模型自動建立一個網(wǎng)站區(qū)域,您可以用來建立,查看,更新和刪除記錄。 這可以在開發(fā)過程中節(jié)省大量時間,使您可以輕松地測試模型,并了解是否擁有正確的數(shù)據(jù)。 管理應用程序還可用于在生產(chǎn)中管理數(shù)據(jù),具體取決于網(wǎng)站的類型。 Django項目僅推薦它用于內(nèi)部數(shù)據(jù)管理(即僅供管理員或組織內(nèi)部人員使用),因為以模型為中心的方法不一定是所有用戶最好的界面,并且暴露了大量不必要的細節(jié) 關于模型。

當您創(chuàng)建骨架項目(有關所需的實際依賴關系的信息,請參閱 class ="external"> Django docs here )。 因此,您必須向管理應用程序添加模型的所有操作都是注冊 在本文末尾,我們將簡要說明如何進一步配置管理區(qū)域以更好地顯示我們的模型數(shù)據(jù)。

注冊模型后,我們將展示如何創(chuàng)建一個新的"超級用戶",登錄到網(wǎng)站,并創(chuàng)建一些書籍,作者,書籍實例和類型。 這些將有助于測試我們將在下一教程中開始創(chuàng)建的視圖和模板。

注冊模型

首先,在目錄應用程序( /locallibrary/catalog/admin.py )中打開 admin.py 它目前看起來像這樣 - 注意它已經(jīng)導入 django.contrib.admin :

from django.contrib import admin

# Register your models here.

通過將以下文本復制到文件底部來注冊模型。 此代碼只是導入模型,然后調(diào)用 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!

這是向站點注冊模型或模型的最簡單方法。 管理網(wǎng)站是高度可自定義的,我們將更多地討論注冊您的模型的其他方法。

創(chuàng)建超級用戶

為了登錄管理網(wǎng)站,我們需要一個啟用了職員狀態(tài)的用戶帳戶。 為了查看和創(chuàng)建記錄,我們還需要此用戶具有管理所有對象的權限。 您可以使用 manage.py 創(chuàng)建一個"超級用戶"帳戶,該帳戶具有對該網(wǎng)站的完全訪問權限和所有需要的權限。

調(diào)用與 manage.py 相同目錄中的以下命令,以創(chuàng)建超級用戶。 系統(tǒng)將提示您輸入用戶名,電子郵件地址和 strong 密碼。

python3 manage.py createsuperuser

一旦此命令完成,新的超級用戶將被添加到數(shù)據(jù)庫。 現(xiàn)在重新啟動開發(fā)服務器,以便我們可以測試登錄:

python3 manage.py runserver

登錄和使用網(wǎng)站

要登錄網(wǎng)站,請打開 / admin 網(wǎng)址(例如 http://127.0。 0.1:8000 / admin ),然后輸入新的超級用戶用戶ID和密碼憑據(jù)(您將被重定向到登錄頁面,然后返回 / admin >輸入您的詳細信息后的網(wǎng)址)。

這部分網(wǎng)站顯示所有我們的模型,按已安裝的應用程序分組。 您可以單擊模型名稱轉(zhuǎn)到列出其所有關聯(lián)記錄的屏幕,然后可以進一步單擊這些記錄以進行編輯。 您也可以直接點擊每個模型旁邊的添加鏈接,開始創(chuàng)建該類型的記錄。

點擊圖書右側(cè)的添加鏈接,創(chuàng)建一本新書(這將顯示一個類似下面的對話框)。 請注意每個字段的標題,所使用的窗口小部件的類型以及 help_text (如果有)與您在模型中指定的值是否匹配。

輸入字段的值。 您可以按相應字段旁邊的 + 按鈕創(chuàng)建新作者或類型(如果您已經(jīng)創(chuàng)建了新作者,則可以從列表中選擇現(xiàn)有值)。 完成后,您可以按保存保存并添加其他保存并繼續(xù)編輯來保存記錄。

; width:841px;">

注意:此時,我們希望您花點時間將一些書籍,作者和類型(例如幻想)添加到您的應用程序中。 確保每個作者和類型包括幾個不同的書(這將使您的列表和詳細視圖更有趣,當我們以后在文章系列中實施)。

添加完書籍后,點擊頂部書簽中的首頁鏈接即可返回主管理頁面。 然后點擊圖書鏈接以顯示當前圖書列表(或通過其他鏈接查看其他模型列表)。 現(xiàn)在您已添加了幾本書,該列表可能與下面的屏幕截圖類似。 顯示每本書的標題; 這是我們在上一篇文章中指定的Book模型的 __ str __()方法中返回的值。

; width:1000px;">

從此列表中,您可以通過選中不需要的圖書旁邊的復選框,從操作下拉列表中選擇 delete ... 然后按開始按鈕。 您也可以按添加書按鈕添加新書。

您可以通過在鏈接中選擇其名稱來編輯圖書。 圖書的編輯頁面(如下所示)幾乎與"添加"頁面完全相同。 主要區(qū)別是網(wǎng)頁標題(更改圖書)以及添加刪除, HISTORY 查看位置 按鈕(最后一個按鈕出現(xiàn),因為我們在模型中定義了 get_absolute_url()方法)。

; width:841px;">

現(xiàn)在返回首頁頁面(使用首頁鏈接面包屑鏈接),然后查看作者流派 >列表 - 您應該已經(jīng)從添加新書時創(chuàng)建了很多,但隨時可以添加一些。

您不會擁有的任何圖書實例,因為這些不是從圖書創(chuàng)建的(雖然您可以從 BookInstance 創(chuàng)建圖書 這是 ForeignKey 字段的性質(zhì))。 返回首頁頁面,然后按相關聯(lián)的添加按鈕,在下面顯示添加圖書實例屏幕。 請注意大的,全局唯一的ID,它可以用于單獨標識庫中的一本圖書的單個副本。

; width:863px;">

為每本圖書創(chuàng)建一些記錄。 將狀態(tài)設置為至少一些記錄的可用,以及其他人的貸款。 如果狀態(tài)為 可用,則還要設置未來的到期日期日期。

而已! 您現(xiàn)在已經(jīng)學會了如何設置和使用管理站點。 您還創(chuàng)建了 Book , BookInstance , Genre 作者的記錄, 使用一旦我們創(chuàng)建自己的視圖和模板。

高級配置

Django使用注冊模型中的信息創(chuàng)建一個基本的管理網(wǎng)站做得很好:

  • 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).

在本節(jié)中,我們將介紹一些改進,以改進我們的 LocalLibrary 接口,包括向 Book Author 添加更多信息 >模型列表,并改進其編輯視圖的布局。 我們不會改變 Language Genre 模型表示,因為它們每個只有一個字段,所以沒有真正的好處!

您可以在 Django管理網(wǎng)站中找到所有管理網(wǎng)站自定義選項的完整參考 (Django文檔)。

注冊ModelAdmin類

要更改模型在管理界面中的顯示方式,請定義 ModelAdmin 類(描述布局)并將其注冊到模型。

讓我們從作者模型開始。 在目錄應用程序中打開 admin.py ( /locallibrary/catalog/admin.py )。 注釋作者模型的原始注冊(前綴為#):

# admin.site.register(Author)

現(xiàn)在添加一個新的 AuthorAdmin 和注冊如下所示。

# Define the admin class
class AuthorAdmin(admin.ModelAdmin):
    pass

# Register the admin class with the associated model
admin.site.register(Author, AuthorAdmin)

現(xiàn)在我們?yōu)?code> Book 和 BookInstance 添加 ModelAdmin 類。 我們再次需要注釋原始注冊:

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

現(xiàn)在創(chuàng)建和注冊新模型; 為了這個演示的目的,我們將使用 @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"),所以管理行為將保持不變! 我們現(xiàn)在可以擴展這些定義我們的特定于模型的管理行為。

配置列表視圖

LocalLibrary 目前列出使用從 __ str __()方法生成的對象名稱的所有作者。 這是很好,當你只有幾個作者,但一旦你有很多,你可能最終有重復。 要區(qū)分它們,或者因為您想要顯示每個作者的更有趣的信息,您可以使用 .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')

重新啟動網(wǎng)站并導航到作者列表。 現(xiàn)在應該顯示上面的字段,如下所示:

; width:941px;">

對于我們的 Book 模型,我們還會顯示作者 genre 。 作者是一個 ForeignKey 字段(一對一)關系,因此將由 __ str()__ 關聯(lián)記錄。 BookAdmin 類替換為以下版本。

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')

不幸的是,我們不能直接在 list_display 中指定 genre ManyToManyField (Django阻止這一點,因為在這樣做會有一個大的數(shù)據(jù)庫訪問"成本")。 相反,我們將定義一個 display_genre 函數(shù)來獲取信息作為字符串(這是我們上面調(diào)用的函數(shù);我們將在下面定義它)。

注意:由于數(shù)據(jù)庫操作的"成本",在此處獲取 genre 可能不是一個好主意。 我們向您展示了如何調(diào)用模型中的函數(shù),因為其他原因非常有用 - 例如,在列表中的每個項目旁邊添加一個刪除鏈接。

將以下代碼添加到您的 Book 模型( models.py )中。 這將從 genre 字段的前三個值(如果它們存在)創(chuàng)建一個字符串,并創(chuàng)建一個可以在管理站點中用于此方法的 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'    

保存模型并更新管理員后,請重新啟動網(wǎng)站并轉(zhuǎn)到圖書列表頁面; 您應該會看到一個類似下面的圖書列表:

; width:947px;">

Genre 模型(和 Language 模型,如果您定義了一個)都有一個字段,因此沒有必要創(chuàng)建一個額外的模型來顯示其他字段。

注意:值得更新 BookInstance 模型列表,以至少顯示狀態(tài)和預期的返回日期。 我們已經(jīng)補充說,作為本文末尾的一個挑戰(zhàn)!

添加列表過濾器

一旦列表中有很多項目,可以過濾顯示的項目是非常有用的。 這是通過列出 list_filter 屬性中的字段來完成的。 將以下代碼段替換為當前的 BookInstanceAdmin 類。

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

列表視圖現(xiàn)在將在右側(cè)包含一個過濾器框。 請注意如何選擇日期和狀態(tài)來過濾值:

整理詳細視圖布局

默認情況下,詳細視圖按照模型中聲明的順序垂直布置所有字段。 您可以更改聲明的順序,顯示(或排除)字段,是否用于組織信息,是否水平或垂直顯示字段,甚至在管理表單中使用哪些編輯窗口小部件。

注意: 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')]

字段屬性僅列出將按順序顯示在表單上的字段。 默認情況下垂直顯示字段,但如果您進一步將它們分組為一個元組,則會水平顯示(如上面的"日期"字段所示)。

重新啟動應用程序并轉(zhuǎn)到作者詳細信息視圖 - 它現(xiàn)在應該如下所示:

; width:928px;">

注意:您也可以使用 exclude 屬性來聲明要從表單中排除的屬性列表(將顯示模型中的所有其他屬性)。

Sectioning the detail view

您可以使用 ModelAdmin.fieldsets"class ="external"> fieldsets 屬性。

BookInstance 模型中,我們有與該書的內(nèi)容相關的信息(即 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;">

內(nèi)聯(lián)編輯關聯(lián)記錄

有時,可以同時添加關聯(lián)記錄是有意義的。 例如,您可以在同一個詳細信息頁面上同時獲取圖書信息和有關特定副本的信息。

您可以通過聲明內(nèi)聯(lián) / a>,類型為 TabularInline >(水平布局)或 StackedInline >(垂直布局,就像默認的模型布局)。 您可以在 Book 詳細信息中添加 BookInstance 信息,方法是在 BookAdmin

class BooksInstanceInline(admin.TabularInline):
? ? model = BookInstance

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

嘗試重新啟動您的應用程序,然后查看一本書的視圖 - 在底部,您現(xiàn)在應該看到與這本書有關的書實例:

; width:937px;">

在這種情況下,我們所做的就是聲明tablular內(nèi)聯(lián)類,它只是添加了內(nèi)聯(lián)模型中的所有字段。 您可以指定布局的所有其他附加信息,包括要顯示的字段,它們的順序,它們是否是只讀的等。(參見 dev / ref / contrib / admin /#django.contrib.admin.TabularInline"class ="external"> TabularInline 了解更多信息)。

注意:此功能有一些痛苦的限制! 在上面的截圖中,我們有三個現(xiàn)有的書實例,其次是三個占位符為新的書實例(看起來非常相似!)。 默認情況下最好沒有備用圖書實例,只需使用添加其他圖書實例鏈接添加它們,或者只需將 BookInstance 列為非 可讀鏈接,但不支持這兩個選項。

挑戰(zhàn)自己

我們在本節(jié)中學到了很多,所以現(xiàn)在是時候嘗試幾個東西。

  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.

    概要

    而已! 您現(xiàn)在已經(jīng)學習了如何以最簡單和改進的形式設置管理站點,如何創(chuàng)建超級用戶以及如何瀏覽管理站點以及查看,刪除和更新記錄。 一路上,你創(chuàng)建了一堆書,BookInstances,類型和作者,我們將能夠列出和顯示一旦我們創(chuàng)建自己的視圖和模板。

    進一步閱讀

    以上內(nèi)容是否對您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號
    微信公眾號

    編程獅公眾號