先決條件: | 首先完成: Django教程第3部分:使用模型。 |
---|---|
目的: | 了解Django管理網(wǎng)站的優(yōu)點(diǎn)和局限性,并使用它為我們的模型創(chuàng)建一些記錄。 |
Django admin 應(yīng)用程式 可以使用您的模型自動(dòng)建立一個(gè)網(wǎng)站區(qū)域,您可以用來建立,查看,更新和刪除記錄。 這可以在開發(fā)過程中節(jié)省大量時(shí)間,使您可以輕松地測(cè)試模型,并了解是否擁有正確的數(shù)據(jù)。 管理應(yīng)用程序還可用于在生產(chǎn)中管理數(shù)據(jù),具體取決于網(wǎng)站的類型。 Django項(xiàng)目?jī)H推薦它用于內(nèi)部數(shù)據(jù)管理(即僅供管理員或組織內(nèi)部人員使用),因?yàn)橐阅P蜑橹行牡姆椒ú灰欢ㄊ撬杏脩糇詈玫慕缑?,并且暴露了大量不必要的?xì)節(jié) 關(guān)于模型。
當(dāng)您創(chuàng)建骨架項(xiàng)目(有關(guān)所需的實(shí)際依賴關(guān)系的信息,請(qǐng)參閱 class ="external"> Django docs here )。 因此,您必須向管理應(yīng)用程序添加模型的所有操作都是注冊(cè)。 在本文末尾,我們將簡(jiǎn)要說明如何進(jìn)一步配置管理區(qū)域以更好地顯示我們的模型數(shù)據(jù)。
注冊(cè)模型后,我們將展示如何創(chuàng)建一個(gè)新的"超級(jí)用戶",登錄到網(wǎng)站,并創(chuàng)建一些書籍,作者,書籍實(shí)例和類型。 這些將有助于測(cè)試我們將在下一教程中開始創(chuàng)建的視圖和模板。
首先,在目錄應(yīng)用程序( /locallibrary/catalog/admin.py )中打開 admin.py 。 它目前看起來像這樣 - 注意它已經(jīng)導(dǎo)入 django.contrib.admin
:
from django.contrib import admin # Register your models here.
通過將以下文本復(fù)制到文件底部來注冊(cè)模型。 此代碼只是導(dǎo)入模型,然后調(diào)用 admin.site.register
來注冊(cè)它們。
from .models import Author, Genre, Book, BookInstance admin.site.register(Book) admin.site.register(Author) admin.site.register(Genre) admin.site.register(BookInstance)
這是向站點(diǎn)注冊(cè)模型或模型的最簡(jiǎn)單方法。 管理網(wǎng)站是高度可自定義的,我們將更多地討論注冊(cè)您的模型的其他方法。
為了登錄管理網(wǎng)站,我們需要一個(gè)啟用了職員狀態(tài)的用戶帳戶。 為了查看和創(chuàng)建記錄,我們還需要此用戶具有管理所有對(duì)象的權(quán)限。 您可以使用 manage.py 創(chuàng)建一個(gè)"超級(jí)用戶"帳戶,該帳戶具有對(duì)該網(wǎng)站的完全訪問權(quán)限和所有需要的權(quán)限。
調(diào)用與 manage.py 相同目錄中的以下命令,以創(chuàng)建超級(jí)用戶。 系統(tǒng)將提示您輸入用戶名,電子郵件地址和 strong 密碼。
python3 manage.py createsuperuser
一旦此命令完成,新的超級(jí)用戶將被添加到數(shù)據(jù)庫。 現(xiàn)在重新啟動(dòng)開發(fā)服務(wù)器,以便我們可以測(cè)試登錄:
python3 manage.py runserver
要登錄網(wǎng)站,請(qǐng)打開 / admin 網(wǎng)址(例如 http://127.0。 0.1:8000 / admin ),然后輸入新的超級(jí)用戶用戶ID和密碼憑據(jù)(您將被重定向到登錄頁面,然后返回 / admin >輸入您的詳細(xì)信息后的網(wǎng)址)。
這部分網(wǎng)站顯示所有我們的模型,按已安裝的應(yīng)用程序分組。 您可以單擊模型名稱轉(zhuǎn)到列出其所有關(guān)聯(lián)記錄的屏幕,然后可以進(jìn)一步單擊這些記錄以進(jìn)行編輯。 您也可以直接點(diǎn)擊每個(gè)模型旁邊的添加鏈接,開始創(chuàng)建該類型的記錄。
點(diǎn)擊圖書右側(cè)的添加鏈接,創(chuàng)建一本新書(這將顯示一個(gè)類似下面的對(duì)話框)。 請(qǐng)注意每個(gè)字段的標(biāo)題,所使用的窗口小部件的類型以及 help_text
(如果有)與您在模型中指定的值是否匹配。
輸入字段的值。 您可以按相應(yīng)字段旁邊的 + 按鈕創(chuàng)建新作者或類型(如果您已經(jīng)創(chuàng)建了新作者,則可以從列表中選擇現(xiàn)有值)。 完成后,您可以按保存,保存并添加其他或保存并繼續(xù)編輯來保存記錄。
; width:841px;">
注意:此時(shí),我們希望您花點(diǎn)時(shí)間將一些書籍,作者和類型(例如幻想)添加到您的應(yīng)用程序中。 確保每個(gè)作者和類型包括幾個(gè)不同的書(這將使您的列表和詳細(xì)視圖更有趣,當(dāng)我們以后在文章系列中實(shí)施)。
添加完書籍后,點(diǎn)擊頂部書簽中的首頁鏈接即可返回主管理頁面。 然后點(diǎn)擊圖書鏈接以顯示當(dāng)前圖書列表(或通過其他鏈接查看其他模型列表)。 現(xiàn)在您已添加了幾本書,該列表可能與下面的屏幕截圖類似。 顯示每本書的標(biāo)題; 這是我們?cè)谏弦黄恼轮兄付ǖ腂ook模型的 __ str __()
方法中返回的值。
; width:1000px;">
從此列表中,您可以通過選中不需要的圖書旁邊的復(fù)選框,從操作下拉列表中選擇 delete ... 然后按開始按鈕。 您也可以按添加書按鈕添加新書。
您可以通過在鏈接中選擇其名稱來編輯圖書。 圖書的編輯頁面(如下所示)幾乎與"添加"頁面完全相同。 主要區(qū)別是網(wǎng)頁標(biāo)題(更改圖書)以及添加刪除, HISTORY 和查看位置 按鈕(最后一個(gè)按鈕出現(xiàn),因?yàn)槲覀冊(cè)谀P椭卸x了 get_absolute_url()
方法)。
; width:841px;">
現(xiàn)在返回首頁頁面(使用首頁鏈接面包屑鏈接),然后查看作者和流派 >列表 - 您應(yīng)該已經(jīng)從添加新書時(shí)創(chuàng)建了很多,但隨時(shí)可以添加一些。
您不會(huì)擁有的任何圖書實(shí)例,因?yàn)檫@些不是從圖書創(chuàng)建的(雖然您可以從 BookInstance
創(chuàng)建圖書
這是 ForeignKey
字段的性質(zhì))。 返回首頁頁面,然后按相關(guān)聯(lián)的添加按鈕,在下面顯示添加圖書實(shí)例屏幕。 請(qǐng)注意大的,全局唯一的ID,它可以用于單獨(dú)標(biāo)識(shí)庫中的一本圖書的單個(gè)副本。
; width:863px;">
為每本圖書創(chuàng)建一些記錄。 將狀態(tài)設(shè)置為至少一些記錄的可用,以及其他人的貸款。 如果狀態(tài)為不 可用,則還要設(shè)置未來的到期日期日期。
而已! 您現(xiàn)在已經(jīng)學(xué)會(huì)了如何設(shè)置和使用管理站點(diǎn)。 您還創(chuàng)建了 Book
, BookInstance
, Genre
和作者
的記錄, 使用一旦我們創(chuàng)建自己的視圖和模板。
Django使用注冊(cè)模型中的信息創(chuàng)建一個(gè)基本的管理網(wǎng)站做得很好:
__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.您可以進(jìn)一步自定義界面,使其更易于使用。 您可以做的一些事情是:
在本節(jié)中,我們將介紹一些改進(jìn),以改進(jìn)我們的 LocalLibrary 接口,包括向 Book
和 Author
添加更多信息 >模型列表,并改進(jìn)其編輯視圖的布局。 我們不會(huì)改變 Language
和 Genre
模型表示,因?yàn)樗鼈兠總€(gè)只有一個(gè)字段,所以沒有真正的好處!
您可以在 Django管理網(wǎng)站中找到所有管理網(wǎng)站自定義選項(xiàng)的完整參考 (Django文檔)。
要更改模型在管理界面中的顯示方式,請(qǐng)定義 ModelAdmin 類(描述布局)并將其注冊(cè)到模型。
讓我們從作者模型開始。 在目錄應(yīng)用程序中打開 admin.py ( /locallibrary/catalog/admin.py )。 注釋作者
模型的原始注冊(cè)(前綴為#):
# admin.site.register(Author)
現(xiàn)在添加一個(gè)新的 AuthorAdmin
和注冊(cè)如下所示。
# 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
類。 我們?cè)俅涡枰⑨屧甲?cè):
#admin.site.register(Book) #admin.site.register(BookInstance)
現(xiàn)在創(chuàng)建和注冊(cè)新模型; 為了這個(gè)演示的目的,我們將使用 @register
裝飾器來注冊(cè)模型(這與 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)在可以擴(kuò)展這些定義我們的特定于模型的管理行為。
LocalLibrary 目前列出使用從 __ str __()
方法生成的對(duì)象名稱的所有作者。 這是很好,當(dāng)你只有幾個(gè)作者,但一旦你有很多,你可能最終有重復(fù)。 要區(qū)分它們,或者因?yàn)槟胍@示每個(gè)作者的更有趣的信息,您可以使用 .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')
重新啟動(dòng)網(wǎng)站并導(dǎo)航到作者列表。 現(xiàn)在應(yīng)該顯示上面的字段,如下所示:
; width:941px;">
對(duì)于我們的 Book
模型,我們還會(huì)顯示作者
和 genre
。 作者
是一個(gè) ForeignKey
字段(一對(duì)一)關(guān)系,因此將由 __ str()__
關(guān)聯(lián)記錄。 將 BookAdmin
類替換為以下版本。
@admin.register(Book) class BookAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'display_genre')
不幸的是,我們不能直接在 list_display
中指定 genre ManyToManyField (Django阻止這一點(diǎn),因?yàn)樵谶@樣做會(huì)有一個(gè)大的數(shù)據(jù)庫訪問"成本")。 相反,我們將定義一個(gè) display_genre
函數(shù)來獲取信息作為字符串(這是我們上面調(diào)用的函數(shù);我們將在下面定義它)。
注意:由于數(shù)據(jù)庫操作的"成本",在此處獲取 genre
可能不是一個(gè)好主意。 我們向您展示了如何調(diào)用模型中的函數(shù),因?yàn)槠渌蚍浅S杏?- 例如,在列表中的每個(gè)項(xiàng)目旁邊添加一個(gè)刪除鏈接。
將以下代碼添加到您的 Book
模型( models.py )中。 這將從 genre
字段的前三個(gè)值(如果它們存在)創(chuàng)建一個(gè)字符串,并創(chuàng)建一個(gè)可以在管理站點(diǎn)中用于此方法的 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'
保存模型并更新管理員后,請(qǐng)重新啟動(dòng)網(wǎng)站并轉(zhuǎn)到圖書列表頁面; 您應(yīng)該會(huì)看到一個(gè)類似下面的圖書列表:
; width:947px;">
Genre
模型(和 Language
模型,如果您定義了一個(gè))都有一個(gè)字段,因此沒有必要?jiǎng)?chuàng)建一個(gè)額外的模型來顯示其他字段。
注意:值得更新 BookInstance
模型列表,以至少顯示狀態(tài)和預(yù)期的返回日期。 我們已經(jīng)補(bǔ)充說,作為本文末尾的一個(gè)挑戰(zhàn)!
一旦列表中有很多項(xiàng)目,可以過濾顯示的項(xiàng)目是非常有用的。 這是通過列出 list_filter
屬性中的字段來完成的。 將以下代碼段替換為當(dāng)前的 BookInstanceAdmin
類。
@admin.register(BookInstance) class BookInstanceAdmin(admin.ModelAdmin): list_filter = ('status', 'due_back')
列表視圖現(xiàn)在將在右側(cè)包含一個(gè)過濾器框。 請(qǐng)注意如何選擇日期和狀態(tài)來過濾值:
默認(rèn)情況下,詳細(xì)視圖按照模型中聲明的順序垂直布置所有字段。 您可以更改聲明的順序,顯示(或排除)字段,是否用于組織信息,是否水平或垂直顯示字段,甚至在管理表單中使用哪些編輯窗口小部件。
注意: LocalLibrary 模型相對(duì)簡(jiǎn)單,因此我們不需要更改布局; 我們會(huì)做一些改變,但是,只是為了告訴你如何。
更新您的 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')]
字段
屬性僅列出將按順序顯示在表單上的字段。 默認(rèn)情況下垂直顯示字段,但如果您進(jìn)一步將它們分組為一個(gè)元組,則會(huì)水平顯示(如上面的"日期"字段所示)。
重新啟動(dòng)應(yīng)用程序并轉(zhuǎn)到作者詳細(xì)信息視圖 - 它現(xiàn)在應(yīng)該如下所示:
; width:928px;">
注意:您也可以使用 exclude
屬性來聲明要從表單中排除的屬性列表(將顯示模型中的所有其他屬性)。
您可以使用 ModelAdmin.fieldsets"class ="external"> fieldsets 屬性。
在 BookInstance
模型中,我們有與該書的內(nèi)容相關(guān)的信息(即 name
, imprint
和 id
) 以及何時(shí)可用( 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') }), )
每個(gè)部分都有自己的標(biāo)題(或無
,如果你不想要一個(gè)標(biāo)題)和字典中相關(guān)的元組字段 - 該格式很復(fù)雜,但很容易理解,如果你 看看上面的代碼片段。
重新啟動(dòng)并導(dǎo)航到書實(shí)例視圖; 表單應(yīng)該如下所示:
; width:947px;">
有時(shí),可以同時(shí)添加關(guān)聯(lián)記錄是有意義的。 例如,您可以在同一個(gè)詳細(xì)信息頁面上同時(shí)獲取圖書信息和有關(guān)特定副本的信息。
您可以通過聲明內(nèi)聯(lián) / a>,類型為 TabularInline >(水平布局)或 StackedInline >(垂直布局,就像默認(rèn)的模型布局)。 您可以在 Book
詳細(xì)信息中添加 BookInstance
信息,方法是在 BookAdmin
class BooksInstanceInline(admin.TabularInline): ? ? model = BookInstance class BookAdmin(admin.ModelAdmin): ? ? list_display = ('title', 'author', 'display_genre') ? ? inlines = [BooksInstanceInline]
嘗試重新啟動(dòng)您的應(yīng)用程序,然后查看一本書的視圖 - 在底部,您現(xiàn)在應(yīng)該看到與這本書有關(guān)的書實(shí)例:
; width:937px;">
在這種情況下,我們所做的就是聲明tablular內(nèi)聯(lián)類,它只是添加了內(nèi)聯(lián)模型中的所有字段。 您可以指定布局的所有其他附加信息,包括要顯示的字段,它們的順序,它們是否是只讀的等。(參見 dev / ref / contrib / admin /#django.contrib.admin.TabularInline"class ="external"> TabularInline 了解更多信息)。
注意:此功能有一些痛苦的限制! 在上面的截圖中,我們有三個(gè)現(xiàn)有的書實(shí)例,其次是三個(gè)占位符為新的書實(shí)例(看起來非常相似!)。 默認(rèn)情況下最好沒有備用圖書實(shí)例,只需使用添加其他圖書實(shí)例鏈接添加它們,或者只需將 BookInstance
列為非 可讀鏈接,但不支持這兩個(gè)選項(xiàng)。
我們?cè)诒竟?jié)中學(xué)到了很多,所以現(xiàn)在是時(shí)候嘗試幾個(gè)東西。
BookInstance
list view, add code to display the?book, status, due?back date, and id (rather than the default __str__()
text).Book
items?to the Author
detail view using the same approach as we did for Book
/BookInstance
.而已! 您現(xiàn)在已經(jīng)學(xué)習(xí)了如何以最簡(jiǎn)單和改進(jìn)的形式設(shè)置管理站點(diǎn),如何創(chuàng)建超級(jí)用戶以及如何瀏覽管理站點(diǎn)以及查看,刪除和更新記錄。 一路上,你創(chuàng)建了一堆書,BookInstances,類型和作者,我們將能夠列出和顯示一旦我們創(chuàng)建自己的視圖和模板。
更多建議: