django 1.8 官方文檔翻譯: 1-2-2 編寫你的第一個Django應用,第2部分

編寫你的第一個 Django 程序 第2部分

本教程上接 教程 第1部分 。 咱們將繼續開發 Web-poll 應用,而且專一在 Django 的 自動生成的管理網站上。html

哲理python

爲你的員工或客戶生成添加、修改和刪除內容的管理性網站是個單調乏味的工做。 出於這個緣由,Django 根據模型徹底自動化建立管理界面。數據庫

Django 是在新聞編輯室環境下編寫的,「內容發表者」和「公共」網站之間有 很是明顯的界線。網站管理員使用這個系統來添加新聞、事件、體育成績等等, 而這些內容會在公共網站上顯示出來。Django 解決了爲網站管理員建立統一 的管理界面用以編輯內容的問題。django

管理界面不是讓網站訪問者使用的。它是爲網站管理員準備的。瀏覽器

啓用管理網站

  • 默認狀況下 Django 管理網站是不啓用的 – 它是可選的。 要啓用管理網站,須要作三件事:服務器

  • 在 INSTALLED_APPS 設置中取消 "django.contrib.admin" 的註釋。app

  • 運行 python manage.py syncdb 命令。既然你添加了新應用到 INSTALLED_APPS 中,數據庫表就須要更新。框架

  • 編輯你的 mysite/urls.py 文件而且將有關管理的行取消註釋 – 共有三行取消了註釋。該文件是 URLconf ;咱們將在下一個教程中深刻探討 URLconfs 。如今,你須要知道的是它將 URL 映射到應用。最後你擁有的 urls.py 文件看起來像這樣:佈局

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', '{{ project_name }}.views.home', name='home'),
    # url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

( 粗體顯示的行就是那些須要取消註釋的行。)性能

啓動開發服務器

讓咱們啓動開發服務器並瀏覽管理網站。

回想下教程的第一部分,像以下所示啓動你的開發服務器:

python manage.py runserver

如今,打開一個瀏覽器並在本地域名上訪問 「/admin/」 – 例如 http://127.0.0.1:8000/admin/ 。你將看到管理員的登陸界面:

和你看到的不同?

若是看到這,而不是上面的登陸界面,那你應該獲得一個相似以下所示的錯誤頁面報告:

ImportError at /admin/ cannot import name patterns ...

那麼你極可能使用的 Django 版本不符合本教程的版本。 你能夠切換到對應的舊版本教程去或者更新到較新的 Django 版本。

進入管理網站

如今嘗試登陸進去。(還記得嗎?在本教程的第一部分時你建立過一個超級用戶的賬號。若是你沒有建立或忘記了密碼,你能夠 另外建立一個 。) 你將看到 Djaong 的管理索引頁:

你將看到一些可編輯的內容,包括 groups ,users 和 sites 。這些都是 Django 默認狀況下自帶的核心功能。

使 poll 應用的數據在管理網站中可編輯

可是 poll 應用在哪? 它但是沒有在管理網站的首頁上顯示啊。

只須要作一件事:咱們須要告訴管理網站 Poll 對象要有一個管理界面。爲此,咱們在你的 polls 目錄下建立一個名爲 admin.py 的文件,並添加以下內容::

from django.contrib import admin
from polls.models import Poll
admin.site.register(Poll)

你須要重啓開發服務器才能看到變化。一般狀況下,你每次修改過一個文件後開發 服務器都會自動載入,可是建立一個新文件卻不會觸發自動載入的邏輯。

探索管理功能

如今咱們已經註冊了 Poll ,那 Django 就知道了要在管理網站的首頁上顯示出來:

點擊 「Polls」 。如今你在 polls 的 「更改列表」 頁。該頁 顯示了數據庫中全部的 polls 可以讓你選中一個進行編輯。 有個 「What’s up?」 poll 是咱們在第一個教程中建立的:

點擊這個」What’s up?」 的 poll 進行編輯:

這有些注意事項:

  • 這的表單是根據 Poll 模型自動生成的。

  • 不一樣模型的字段類型 (DateTimeField, CharField) 會對應的相應的 HTML 輸入控件。 每一種類型的字段 Djaong 管理網站都知道如何顯示它們。

  • 每一個 DateTimeField 都會有個方便的 JavaScript 快捷方式。日期有一個 「Today」 快捷方式和彈出式日曆,而時間有個 「Now」 快捷方式和一個列出了經常使用時間選項的彈出式窗口。

在頁面的底部還爲你提供了幾個選項:

  • Save – 保存更改並返回到當前類型的對象的更改列表頁面。

  • Save and continue editing – 保存更改並從新載入當前對象的管理界面。

  • Save and add another – 保存更改並載入當前對象類型的新的空白表單。

  • Delete – 顯示刪除確認頁。

若是 「Date published」 的值與你在第一部分教程時建立的 poll 的時間不符,這可能 意味着你忘記了將 TIME_ZONE 設置成正確的值了。修改正確後再重啓載入頁面 來檢查值是否正確。

分別點擊 「Today」 和 「Now」 快捷方式來修改 「Date published」 的值。 而後點擊 「Save and continue editing」 。最後點擊右上角的 「History」 。 你將看到一頁列出了經過 Django 管理界面對此對象所作的所有更改的清單的頁面, 包含有時間戳和修改人的姓名等信息:

自定義管理表單

花些時間感嘆一下吧,你沒寫什麼代碼就擁有了這一切。經過 admin.site.register(Poll) 註冊了 Poll 模型,Django 就能構造一個默認的 表單。一般狀況下,你將要自定義管理表單的外觀和功能。這樣的話你就須要在註冊對象 時告訴 Django 對應的配置。

讓咱們來看看如何在編輯表單上給字段從新排序。將 admin.site.register(Poll) 這行替換成::

class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

你將遵循這個模式 – 建立一個模型的管理對象,將它做爲 admin.site.register() 方法的第二個參數傳入 – 當你須要爲一個對象作管理界面配置的時候。

上面那特定的更改使得 「Publication date」 字段在 「Question」 字段以前:

僅有兩個字段不會令你印象深入,可是對於有許多字段的管理表單時,選擇一個直觀 的排序方式是一個重要的實用細節。

剛纔所說的有許多字段的表單,你可能想將表單中的字段分割成 fieldsets ::

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Poll, PollAdmin)

在 fieldsets 中每個 tuple 的第一個元素就是 fieldset 的標題。 下面是咱們表單如今的樣子:

你能夠爲每一個 fieldset 指定 THML 樣式類。Django 提供了一個 "collapse" 樣式類用於顯示初始時是收縮的 fieldset 。 當你有一個包含一些不經常使用的長窗體時這是很是有用的

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
Fieldset is initially collapsed

添加關聯對象

Ok,如今咱們有了 Poll 的管理頁面。可是一個 Poll 擁有多個 Choices ,而 該管理頁面並無顯示對應的 choices 。

是的。

咱們有兩種方法來解決這個問題。第一種就像剛纔 Poll 那樣在管理網站上 註冊 Choice 。這很簡單:

from polls.models import Choice

admin.site.register(Choice)

如今 「Choices」 在 Django 管理網站上是一個可用的選項了。」Add choice」 表單 看起來像這樣:

該表單中,Poll 字段是一個包含了數據庫中每一個 poll 的選擇框。 Django 知道 ForeignKey 在管理網站中以 <select> 框顯示。在本例中,選擇框中僅存在一個 poll 。

另外請注意 Poll 旁邊的 「Add Another」 連接。每一個有 ForeignKey 的對象關聯到其餘對象都會獲得這個連接。 當點擊 「Add Another」 時,你將會得到一個 「Add poll」 表單的彈出窗口。 若是你在窗口中添加了一 poll 並點擊了 「Save」 按鈕, Django 會將 poll 保存至數據庫中而且動態的添加爲你正在查看的 「Add choice」 表單中的 已選擇項。

可是,這真是一個低效的將 Choice 對象添加進系統的方式。 若是在建立 Poll 對象時可以直接添加一批 Choices 那會更好。 讓咱們這樣作吧。

移除對 Choice 模型的 register() 方法調用 。而後,將 Poll 的註冊代碼 編輯爲以下所示:

from django.contrib import admin
from polls.models import Choice, Poll

class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Poll, PollAdmin)

這將告訴 Django: 「Choice 對象在 Poll 管理頁面中被編輯。 默認狀況下,提供 3 個 choices 的字段空間。

載入 「Add poll」 頁面來看看,你可能須要重啓你的開發服務器:

它看起來像這樣:多了三個爲關聯 Choices 提供的輸入插槽 – 由 extra 指定 – 而且每次你在 「Change」 頁修改已經建立的對象時,都會另外得到三個額外插槽。

在現有的三個插槽的底部,你會發現一個 「Add another Choice」 連接。 若是你點擊它,一個新的插槽會被添加。若是想移除添加的插槽, 你能夠點擊所添加的插槽的右上方的 X 。注意你不能移除原有的三個插槽。 此圖片中顯示了新增的插槽:

還有個小問題。爲了顯示全部關聯 Choice 對象的字段須要佔用大量的 屏幕空間。爲此,Django 提供了一個以表格方式顯示內嵌有關聯對象的方式; 你只須要將 ChoiceInline 聲明改成以下所示:

class ChoiceInline(admin.TabularInline):
    #...

使用了 TabularInline 後(而不是 StackedInline) ,基於表的格式下相關 對象被顯示的更緊湊了:

須要注意的是有個額外的 「Delete?」 列容許保存時移除已保存過的行。

自定義管理界面的變動列表

如今 Poll 的管理界面看起來不錯了,讓咱們給 「chang list」 頁面作些調整 – 顯示系統中全部 polls 的頁面。

下面是如今的樣子:

默認狀況下, Django 顯示的是每一個對象 str() 的結果。可是如果咱們可以 顯示每一個字段的話有時會更有幫助的。要作到這一點,須要使用 list_display 管理選項,這是一個 tuple ,包含了要顯示的字段名, 將會以列的形式在該對象的 chang lsit 頁上列出來::

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date')

效果再好的點話,讓咱們把在第一部分教程中自定義的方法 waspublishedrecently 也包括進來:

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_recently')

如今 poll 的變動列表頁看起來像這樣:

你能夠點擊列的標題對這些值進行排序 – 除了 waspublishedrecently 這一列,由於不支持根據方法輸出的內容的排序。還要注意的是默認狀況下列的標題是 waspublishedrecently ,就是方法名(將下劃線替換爲空格),而且每一行以字符串形式輸出。

你能夠經過給該方法 (在 models.py 內 ) 添加一些屬性來改善顯示效果,以下所示::

class Poll(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

再次編輯你的 admin.py 文件並添加一個改進 Poll 的 change list 頁面效果的功能: 篩選 ( Filters ) 。在 PollAdmin 內添加一行以下所示的代碼::

list_filter = ['pub_date']

這就增長了一個 「篩選」 的側邊欄,讓人們經過 pub_date 字段的值來篩選 change list 顯示的內容:

顯示篩選的類型取決於你須要篩選的字段類型。 由於 pub_date 是一個 DateTimeField 的實例,Django 知道提供對應的篩選選項:」Any date,」 「Today,」 「Past 7 days,」 「This month,」 「This year.」

爲了效果更好。讓咱們來加上搜索功能::

search_fields = ['question']

在 chang list 頁的頂部增長了一個搜索框。當有人輸入了搜索條件, Django 將搜索 question 字段。 雖然你可使用任意數量的字段,如你但願的那樣 – 可是由於它在後臺用 LIKE 查詢,爲了保持數據庫的性能請合理使用。

最後,由於 Poll 對象有日期字段,根據日期來向下鑽取記錄將會很方便。 添加下面這一行代碼::

date_hierarchy = 'pub_date'

這會在 change list 頁的頂部增長了基於日期的分層導航功能。 在最頂層,顯示全部可用年份。而後可鑽取到月份,最終到天。

如今又是一個好時機,請注意 change lists 頁面提供了分頁功能。默認狀況下每一頁顯示 100 條記錄。 Change-list 分頁,搜索框,篩選,日期分層和列標題排序如你所原地在一塊兒運行了。

自定義管理界面的外觀

顯而易見,在每個管理頁面頂部有 「Django administration」 是無語的。雖然它僅僅是個佔位符。

不過使用 Django 的模板系統是很容易改變的。Django 管理網站有 Django 框架自身的功能,能夠經過 Django 自身的模板系統來修改界面。

自定義你的 項目 模板

在你的項目目錄下建立一個 templates 目錄。模板能夠放在你的文件系統的任何地方,Diango 都能訪問。 (Django 能以任何用戶身份在你的服務器上運行。) 而後,在你的項目中保存模板是一個好習慣。

默認狀況下,TEMPLATE_DIRS 值是空的。所以,讓咱們添加一行代碼,來告訴 Django 咱們的模板在哪裏::

TEMPLATE_DIRS = (
    '/path/to/mysite/templates', # 將此處改成你的目錄。
)

如今從 Django 源代碼中自帶的默認 Django 管理模板的目錄 (django/contrib/admin/templates) 下複製 admin/basesite.html 模板到你正在使用的 TEMPLATEDIRS 中任何目錄的子目錄 admin 下。例如:若是你的 TEMPLATEDIRS 中包含 '/path/to/mysite/templates' 目錄, 如上所述,複製 django/contrib/admin/templates/admin/basesite.html 模板到 /path/to/mysite/templates/admin/base_site.html 。不要忘了是 admin 子目錄。

Django 的源代碼在哪裏?

若是在你的文件系統中很難找到 Django 源代碼,能夠運行以下命令:

python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"

而後,只須要編輯該文件並將通用的 Djangot 文字替換爲你認爲適合的屬於你本身的網站名。

該模板包含了大量的文字,好比 {% block branding %} 和 {{ title }}{% 和 {{ 標記是 Django 模板語言的一部分。 當 Django 呈現 admin/base_site.html 時,根據模板語言生成最終的 HTML 頁面。 Don’t worry if you can’t make any sense of the template right now – 若是你如今不能理解模板的含義先不用擔憂 – 咱們將在教程 3 中深刻探討 Django’ 的模板語言。

請注意 Django 默認的管理網站中的任何模板都是可覆蓋的。 要覆蓋一個模板,只須要像剛纔處理 base_site.html 同樣 – 從默認的目錄下複製到你的自定義目錄下,並修改它。

自定義你的 應用 模板

細心的讀者會問:若是 TEMPLATE_DIRS 默認的狀況下是空值, 那 Django 是如何找到默認的管理網站的模板的? 答案就是在默認狀況下, Django 會自動在每個應用的包內查找 templates/ 目錄,做爲備用使用。 (不要忘記 django.contrib.admin 是一個應用)。

咱們的 poll 應用不是很複雜並不須要自定義管理模板。可是若是它變得更復雜 並且爲了一些功能須要修改 Django 的標準管理模板,修改應用模板將是更 明智的選擇,而不是修改項目模板。經過這種方式,你能夠在任何新項目包括 polls 應用中自定義模板而且放心會找到須要的自定義的模板的。

有關 Django 怎樣找到它的模板的更多信息,請參考 模板加載文檔 。

自定義管理網站的首頁

於此相似,你可能還想自定義 Django 管理網站的首頁。

默認狀況下,首頁會顯示在 INSTALLED_APPS 中全部註冊了管理功能的應用, 並按字母排序。你可能想在頁面佈局上作大修改。總之,首頁多是管理網站中最重要的頁面, 所以它應該很容易使用。

你須要自定義的模板是 admin/index.html 。 (同先前處理 admin/basesite.html 同樣 – 從默認目錄下複製到你自定義的模板目錄下。) 編輯這個文件,你將看到一個名爲 applist 的模板變量。這個變量包含了每個 已安裝的 Django 應用。你能夠經過你認爲最好的方法硬編碼連接到特定對象的管理頁面,而不是使用默認模板。 再次強調,若是你不能理解模板語言的話不用擔憂 – 咱們將在教程 3 中詳細介紹。

當你熟悉了管理網站的功能後,閱讀 教程 第3部分 開始開發公共 poll 界面。

譯者:Django 文檔協做翻譯小組,原文:Part 2: The admin site

本文以 CC BY-NC-SA 3.0 協議發佈,轉載請保留做者署名和文章出處。

Django 文檔協做翻譯小組人手緊缺,有興趣的朋友能夠加入咱們,徹底公益性質。交流羣:467338606。

相關文章
相關標籤/搜索