【譯】本身動手寫Django app,第二部分【完】

原文地址:https://docs.djangoproject.com/en/1.4/intro/tutorial02/ html

這個教程從教程一留下的東西開始的。咱們繼續網絡調查應用程序同時咱們將會關注Django的自動生成的管理站點。 python

(哲學:爲你的員工或者客戶生成增長,修改或刪除內容的站點是一個枯燥無味的工做,由於這不須要太多的創造性。因爲這個緣由,Django徹底自動爲模型建立管理接口。Django是在新聞編輯室的環境中開發出來的,當時在「內容發佈」和「發佈」站點上有一個很明確的區分。站點管理是用系統來增長新的故事,事件,運動得分等等,這些內容發佈在公共站點上。Django經過建立一個統一的接口方便管理員編輯內容解決了這一問題。管理站點不是爲網站的訪問者準備的,它是爲網站管理者準備的。) 數據庫

1、激活管理站點 django

默認狀況下Django不激活管理站點——這是一個選擇的東西。爲你的程序激活管理站點,作下面三件事: 編程

    在INSTALLED_APPS設置中取消「django.contrib.admin」的註釋。 瀏覽器

    運行python manage.py syncdb。由於你向INSTALLED_APPS增長了新的應用程序,數據庫的表須要更新。 服務器

    編輯mysite/urls.py文件,在提到admin的那一行去掉註釋——這裏總共有三行要取消註釋。這個文件是URL配置文件。在下一個教程中咱們將深刻學習URL配置文件。如今,你只須要知道它映射根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)),
)

2、啓動開發服務器 app

讓咱們啓動開發服務器來探索管理站點。 函數

像教程1中同樣經過python manage.py runserver來啓動開發服務器,如今在打開瀏覽器在你本地域名後「/admin/」的地方——好比說,http://127.0.0.1:8000/admin/。你應該看到管理員登錄界面:

(和你看到的不同?:若是這個時候你獲得的不是上面的登錄頁面,而是錯誤頁面報告的頁面就像:

ImportError at /admin/
cannot import name patterns
...
那麼可能你使用的Django版本和這個教程版本不匹配。你要嗎換到更老的教程或者更新的Django版本。)

3、進入管理站點

如今,嘗試着登錄。(你已經在教程1建立了一個超級帳戶,還記得嗎?若是你沒有建立或者忘記了密碼,你能夠再建立一個用戶。)你應該看到Django的管理索引頁面:

你應該能看到一些編輯內容的東西,包括組,用戶和網站。這些默認狀況下是Django的核心特徵。

4、使調查程序在管理站點中能夠修改

可是咱們的調查程序在什麼地方呢?它尚未在管理索引頁面顯示出來。

只須要作一件事:咱們須要告訴管理站點Poll對象有一個管理接口。爲了這樣,你能夠在polls目錄下建立一個叫admin.py文件,編程成下面形式:

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

admin.site.register(Poll)

你須要從新啓動開發服務器才能看到這些改變。正常狀況下,服務器在你每次修改文件時會自動從新加載代碼,可是建立一個新的文件的行爲不觸發自動加載邏輯。


5、探索管理站點的功能

如今咱們已經註冊了Poll對象,Django知道它應該在管理索引頁面顯示出來:

點擊」Polls「,如今你在調查程序的」change list「頁面了。這個頁面顯示你數據庫中全部的調查,讓你能夠選擇任何一個來改變它。這裏有一個咱們在教程1建立的「What's up?」調查:

點擊「What's up?」來編輯它:

這裏須要注意的事情:

    表單是Poll模型自動生成的;

    不一樣的模型的空間類型(DataTimeField,CharField)對應着相關的HTML輸入部件,每一個空間類型知道如何在Django管理頁面中顯示它本身;

    每一個DateTimeField能得到一個免費的JavaScript的快捷方式。日期得到一個「Today」的快捷方式和日曆彈出對話框,時間得到一個「Now」快捷方式和一個方便的列舉經常使用進入時間的對出框;

頁面底部給你許多選項:

    Save——保存改動,然會返回這種對象類型的改動列表頁面;

    Save and continue editing——保存改動,從新載入對象管理頁面;

    Save and add another——保存改動,載入一個這種對象類型的新的空白表單;

    Delete——顯示一個刪除確認頁面;

若是「Date published」的值和你在教程1中建立的時間不相同,這可能意味着你忘記了TIME_ZONE的正確值了。修改它,而後從新載入頁面檢查正確的值是否出現了。

經過點擊「Today」和「Now」快捷方式來改變「Date published」。而後點擊「Save and continue editing」。而後在右上方點擊歷史,你能夠看到一頁列滿了經過Django管理站點對這個對象的改動,同時還帶有時間戳和改動的用戶:

6、定製管理站點表單

花幾分鐘時間看看你這神奇的代碼,雖然你不須要寫。經過用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」以前:

只有兩個領域並不讓人印象深入,可是對於許多領域的管理站點表單,選擇一個直觀的排序是重要的使用細節。

說起許多領域的表單,你可能但願把表單分割成領域塊:


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

admin.site.register(Poll, PollAdmin)
領域塊中每一個元組的第一個元素是領域塊的標題,下面是咱們的表單外觀:


你能夠給每一個領域塊分配絕對的HTML類。Django在初始時提供一個「collapse」類來顯示特別地領域塊。當你有一個很長而且包含許多不經常使用的領域的表單時這頗有效:

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

7、增長相關對象

好了,咱們有一個Poll對象管理站點頁面,可是一個Poll有多個Choices,可是管理站點頁面沒有顯示選擇。可是這裏有2種方法解決這個問題,第一個是就像咱們處理Poll對象同樣在admin裏註冊Choice,這很簡單:

from polls.models import Choice

admin.site.register(Choice)
如今,「Choices」在Django的管理頁面上能夠選擇了。「Add choice」表單看起來應該像這樣:

在這個表單中,「Poll」區域是數據庫中包含每一個調查的選擇框,Django知道ForeignKey在管理站點中應該做爲一個<select>框,在咱們的例子中,如今只有一個調查記錄存在。

同時注意到「Add Another」連接到下一個「Poll」,每個擁有ForeignKey關係的對象都能自動這樣。當你點擊「Add another」,你能夠看到一個帶有「Add poll」表單的彈出對話框。若是你在這個對話框中增長一個調查記錄而後點擊「Save」,Django會把這個調查記錄保存到數據庫,並自動把它加到你在「Add another」下方便你能夠作出選擇。

但實際上,這種方法向系統增長對象是效率不高的。最好是在建立Poll對象時你能直接增長一些列Choices,讓咱們實現這個:

刪除Choice模型的register()調用函數,而後編輯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:「在Poll管理站點頁面上Choice對象時可編輯的,默認狀況下,爲三個選擇提供作夠的區域。」

從新載入」Add poll」頁面去看看效果,可能你須要重啓你的開發服務器:

它就是像這樣的。對相關的Choices有三個位置(做爲額外特別的),每次你來到一個已經建立的對象的「Change」頁面上你,亦能夠看到三個額外的位置。

在這三個目前的位置下面你能夠找到一個「Add another」連接,若是你點擊它,將會建立一個新的位置。若是你想刪除增長的位置,你能夠點擊增長位置右上角的X。注意,你不能刪除原始的三個位置。下面顯示的是增長了位置的圖片:

可是有個小的問題。爲進入相關Choice對象已經花了許多屏幕空間用來些事這些領域。因爲這個緣由,Django提供了顯示內聯相關對象的表格方式,你須要改變ChoiceInline成下面的樣子:

class ChoiceInline(admin.TabularInline):
    #...
有了這個TabularInline(而不是StackedInline),相關對象以更緊湊、基於表格格式顯示出來:

如今這裏有一個額外的「Delete?」欄可讓你刪除你用「Add Another Choice」按鈕建立並已經保存的行。

8、定製管理站點改動列表

如今Poll管理站點頁面看起來還行,就讓咱們對「change list」(顯示系統中全部的調查)作一些調整。

下面是如今站點的樣子:

默認狀況下,Django顯示每一個對象的str()。可是有時候當咱們想顯示我的區域時可能更有用。爲了實現這個,咱們使用list_display管理選項(這是用來顯示的區域名字的元組)在對象改動列表頁面做爲列:

class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date')
爲了完善措施,讓咱們也把教程1的was_published_recently方法加進來:
class PollAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question', 'pub_date', 'was_published_recently')
如今調查改動列表頁面看起來是這樣子的:

你能夠點擊列的標題把這些內容排序(除了was_published_recently列的標題,由於暫不支持絕對方法輸出排序)。注意默認狀況下was_published_recently列的標題是方法(用下劃線替代空格)的名字,每一行包含輸出字符串的表示。

你能夠像下面同樣給方法(在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改動列表頁面增長一個完善:過濾器。把下面的東西增長到PollAdmin:
list_filter = ['pub_date']
這就增長了一個「Filter」邊欄讓人按照pub_date過濾改動列表:

過濾器顯示的種類依賴於你使用過濾器的區域的類型。由於pub_date是DateTimeField,Django知道給一個合適的過濾器選項:「Any date」,「Today」,「Past 7 days」,「This month」,「This year」。

一切進展的都比較順利。讓咱們增長一些搜索功能:

search_fields = ['question']
這是在改動列表的頂部增長了一個搜索框。當有人輸入搜索條件是,Django會搜索question區域,你能夠用你喜歡用的許多區域,儘管由於這是在屏幕後面使用了一個LIKE查詢是數據庫穩定工做。

最後,由於Poll對象有日期,所以日期的降序排列會更方便。增長下面這行:

date_hierarchy = 'pub_date'
這在改動列表頁面的頂部增長了一個按照日期的層次結構。在最上層,它顯示全部存在的年。而後向下是月,最終是日。

注意改動列表給了你一個頁碼。默認狀況下每頁顯示100條記錄。改動列表分頁,搜索框,過濾器,時間層次結構和列排列都像預期中預期的那樣工做。

9、定製管理頁面的外觀和感受

很明顯,在每一個管理頁面的頂部有個「Django administration」是很荒唐的。實際上這是放置文本的地方。

可是,使用Django的模板系統很容易改變這個。Django管理系統是由Django本身支持的,它的接口也是Django本身的模板系統。

打開你的設置文件(mysite/settings.py)查看TEMPLATE_DIRS設置。TEMPLATE_DIRS是一個用來檢測合適載入Django模板的系統文件目錄的元組。它是一個搜索路徑。

默認狀況下,TEMPLATE_DIRS是空的,所以,讓咱們給它增長一行告訴Django咱們的模板在什麼地方:

TEMPLATE_DIRS = (
    '/home/my_username/mytemplates', # Change this to your own directory.
)
如今從默認Django的管理模板目錄下(Django自身的源代碼,django/contrib/admin/template)把 admin/base_site.html拷貝到一個你正在使用的TEMPLATE_DIRS的admin子目錄下。好比說,若是你的 TEMPLATE_DIRS是'/home/my_username/mytemplate',像上面說的同樣,把django/contrib /admin/templates/base_site.html拷貝到/home/my_username/mytemplates/admin /base_site.html。不要忘記這是一個admin子目錄。

(Django源代碼文件在哪?:若是找你係統上的Django的源文件有困難,運行下面的命令:

python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"
而後只要編輯而後用你本身想用的網站名字替代生成Django的文本。

這個模 板文件包含許多像{% block branding %}和{{ title }}。{%he {{是Django的模板語言的部分標記。當Django提供了admin/base_site.html時,模板語言會自動生成最後的HTML頁面。現 在不要擔憂你一點都看不懂模板——在教程3中咱們會深刻講解Django的模板語言。

如今任何Django默認都管理模板都是能夠重寫的。爲了重寫一個模板,只要作你對base_site.html作的事情同樣就好了——把它從默認地方拷貝到你定製的目錄,而後作出相應的改動。

可是機敏的讀者會問:若是TEMPLATE_DIRS是空的話,Django怎麼找到默認的管理模板呢?其實,默認狀況下,Django會在每一個應用程序包的templates/子目錄下去查找的,做爲一個後備。所有信息詳見模板載入文檔。

10、定製管理索引頁面

一個相似的要注意的東西,你可能想定製Django管理索引頁面的外觀和感受。

默認狀況下,系統按照字母表的順序顯示已經在管理應用程序中註冊的INSTALLED_APPS。你可能像對整個佈局作出重大改變。畢竟,索引頁面可能對管理頁面來講是最重要的頁面,並且它應該容易使用。

要 定製的莫辦事admin/index.html。(就像在前一個部分處理admin/base_site.html同樣——從默認的目錄複製到你定製模板 的目錄。)編輯文件,而後你就能看到它用了一個叫app_list的模板變量。這個變量包含了Django安裝的每一個應用程序。這並非使用它,而是你可 以隨意用代碼把它和明確對象的管理頁面相關聯。再次,不要擔憂你不懂模板語言——在教程3中將會涉及到它。

當你據對管理頁面適應了,讀教程3開始公共調查的視圖。

教程2結束!
相關文章
相關標籤/搜索