生成添加、修改和刪除內容的管理性網站是個單調乏味的工作。 出于這個原因,Django 根據模型完全自動化創建管理界面。
Django 是在新聞編輯室環境下編寫的,“內容發表者”和“公共”網站之間有 非常明顯的界線。網站管理員使用這個系統來添加新聞、事件、體育成績等等,而這些內容會在公共網站上顯示出來。Django 解決了為網站管理員創建統一 的管理界面用以編輯內容的問題。
管理界面不是讓網站訪問者使用的。它是為網站管理員準備的。
首先,我們必須創建一個能夠登錄管理頁面的用戶,運行如下命令:
python manage.py createsuperuser
接著按要求輸入期望的用戶名然后按下 Enter 鍵,這里以 admin 為例
Username : admin
接下來將提示輸入期望的郵箱地址:
Email address: admin@example.com
最后一步為輸入密碼,照慣例輸入兩次以確認密碼
PassWord: **********Password (again): *********Superuser created successfully.
Django 管理界面默認是激活的,現在就啟動開發服務器并一起開始探索吧
如前面提到的用以下命令來啟用開發服務器:
python manage.py runserver
打開網頁瀏覽器訪問本地域名的/admin/目錄,如默認的 http://127.0.0.1:8000/admin/,然后就可以看到如下登錄界面

由于翻譯功能默認開啟,前面在settings.py 中設置了語言為中文,因此此處顯示的是中文界面,默認為英文界面
現在可以使用前面所創建的超級用戶登錄了,正常情況下應該看到如下頁面

這里將看到一些可編輯的內容,包括 組(groups)和用戶(users)。這些都是 Django 默認情況下自帶的核心框架。
細心觀察就可以發現,我們創建的 app 并沒有出現在該管理頁面中,怎樣讓 app 出現在管理界面呢?只需要做一件事:向admin注冊Question對象。
打開 polls/admin.py 文件,然后修改成以下內容即可
from django.contrib import adminfrom polls.models import Questionadmin.site.register(Question)
重新打開管理頁面你就會發現我們的app出現在管理頁面中了

點擊“Questions”,現在我們所處的位置為 questions 的更改列表頁,這個頁面將顯示出所有存在于數據庫中的 question 并讓我們進行選擇修改,這里可以看到之前創建的question:"What's up?"

點擊"what's up?"進行編輯

如果Date published 與創建時的時間不同,說明在設置 TIME_ZONE值的時候沒有設置正確,修改后重啟。
 點擊快捷方式“今天”和“現在”來修改“Date published”,修改完后選擇“保存并繼續編輯”,然后點擊右上方的“歷史”,此時可以看到管理頁面列出了所有所有的修改記錄,包括時間和執行修改的用戶的用戶名。
通過admin.site.register(Question) 注冊了 Question 這個model,Django 就會自動生成一個默認的表單。但是通常情況下,我們都會想要自定義管理表單的外觀和功能。這就需要我們在注冊對象的同時進行相應的配置。
接下來就看看怎樣在編輯表單上給字段重新排序。將 admin.site.register(Question) 這行替換成如下:
from django.contrib import adminfrom polls.models import Questionclass QuestionAdmin(admin.ModelAdmin): fields = ['pub_date', 'question_text']admin.site.register(Question, QuestionAdmin)
我們需要遵循如下模式——創建一個model 管理對象,然后最為第二個參數傳入 admin.site.register() ——任何需要做管理界面的配置的時候都要遵循
上面的修改使得 “發表時間”出現在了“Question”上面

僅有兩個字段可能沒法留下太深的印象,但是對于有多個字段的管理表單時選擇一個直觀 的排序方式是很重要的實用細節。說起多個字段的表單,我們可能會想要將其分組打包:
from django.contrib import adminfrom polls.models import Questionclass QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date']}), ]admin.site.register(Question, QuestionAdmin)
分組中每個元祖的第一個元素作為該分組的標題,如下便是修改后的表單的樣子:

除此之外,我們還可以為每一個分組指定HTML樣式類。Django 提供了一個“collapse”類用于顯示初始狀態為收縮的分組,當有一個包含一些不常用的長窗體時是非常有用的。
from django.contrib import adminfrom polls.models import Questionclass QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ]

現在我們已經擁有了Question的管理頁面了,但是一個 Question 有多個的 Choice,而管理頁面卻沒有顯示出來?
這里有兩種方法解決這個問題:第一種是像前面注冊Question那樣注冊Choice,簡單的添加幾行代碼即可:
from django.contrib import adminfrom polls.models import Choice, Question# ...admin.site.register(Choice)
現在 “Choice” 就是Django 管理頁面上一個可用的選項了,“添加 Choice”表單如下:

在該表單中,“Question” 字段是一個包含了數據庫中所有question的下拉選擇框,Django 知道應該將外鍵以<select>框顯示。當然了,現在還只有一個question 存在。
同時注意到“Questin”旁邊的“+”,每一個擁有外鍵的對象關聯到其他對象時都會產生這個鏈接。當點擊“+”時,將彈出一個添加“添加Question”的窗口。如果添加了Quesiton并保存,Django將會把它保存到數據庫中并且動態地添加到現在正在查看的“添加 Choice”表單中的已選項。
注意:通過上面的方式添加choice是一種非常低效的做法,如果在一開始創建Question對象時就添加一批Choice則會顯得更高效,接下來就嘗試著這么干。
移除Choice對register()方法的調用,接著將Question的注冊代碼改成如下:
from django.contrib import adminfrom polls.models import Choice, Questionclass ChoiceInline(admin.StackedInline): model = Choice extra = 3class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline]admin.site.register(Question, QuestionAdmin)
這將告訴Django:Choice對象將在Question管理界面中被編輯。默認情況下,將提供三個Choice的字段空間。重新載入“添加 question”頁面看看效果:

在三個choice最下面有一個“+添加另一個Choice”按鈕,當需要添加更多時可以使用,而當想刪除choice插槽時可以點擊相應插槽右上方的小'x'。注意:三個默認的插槽無法刪除。

還有個小問題。為了顯示所有關聯 Choice 對象的字段需要占用大量的 屏幕空間。為此,Django 提供了一個以表格方式顯示內嵌有關聯對象的方式; 只需要將 ChoiceInline 聲明改為如下所示即可:
class ChoiceInline(admin.TabularInline): #...
使用了 TabularInline 后(而不是 StackedInline) ,基于表的格式下相關 對象被顯示的更緊湊了:

需要注意的是有個額外的 “Delete?” 列允許保存時移除已保存過的行。
默認情況下,Django顯示出的是每個對象經str()處理過的結果。但有些時候如果能顯示每個字段的值則會更好。做到這一點需要用list_display這個管理選項,這是一個包含要顯示的字段名的元組,將會以列的形式在該對象的修改列表頁上顯示出來。
class QuestionAdmin(admin.ModelAdmin): # ... list_display = ('question_text', 'pub_date','was_published_recently')
現在Question的更改列表頁就像如下所示:

除了 was_published_recently 這一列,因為不支持根據方法輸出的內容的排序外,可以點擊列的標題對這些值進行排序。默認情況下,列的標題為方法名,下劃線會被自動替換成空格,并且每一行以字符串形式進行輸出。
當然,還可以通過給該方法(polls/models.py)添加一些屬性來改善顯示效果,如以下所示:
class Question(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?'
再次編輯 polls/admin.py 并添加一個改進Question的修改列表的功能(篩選),在QuestionAdmin中添加以下內容:
list_filter = ['pub_date']
這就增加了一個 “篩選” 的側邊欄,可以通過 pub_date 字段的值來篩選 change list 顯示的內容:

顯示篩選的類型取決于需要篩選的字段類型。 因為 pub_date 是一個 DateTimeField 的實例,Django 提供對應的篩選選項:”任意日期,” “今天,” “過去7天,” “本月,” “今年.”
接下來再添加個搜索功能:
search_fields = ['question_text']
可以看到在修改i列表頁上方增加了一個搜索框,雖然可以使用任意數量的字段進行搜索,但是因為它在后臺用 LIKE 查詢,為了保持數據庫的性能請合理使用。當然除此之外還有其他功能可以添加,不一一列舉。
顯然,在每一個管理頁面頂部都有著"Django administration"是很不科學的,盡管只是個占位符號。
不過使用 Django 的模板系統是很容易改變的。Django 管理網站有 Django 框架自身的功能,可以通過 Django 自身的模板系統來修改界面。
自定義項目模版
在項目目錄下創建一個templates文件夾,模版可以放在文件系統的任何位置,Django可以以任何用戶身份在你的服務器上運行,因此均可以訪問到。不過,最好養成將模版文件保存在項目中的好習慣。
打開配置文件(mysite/settings.py)并添加一個 TEMPLATE_DIRS 設置:
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
現在創建一個帶templates文件夾的admin文件夾,然后從 Django 源代碼中自帶的默認 Django 管理模板的目錄 (django/contrib/admin/templates) 下復制admin/base_site.html 模板到該文件夾。
Django 的源代碼在哪里?如果找不到的可以通過如下腳本找到
import syssys.path = sys.path[1:]import djangoPRint(django.__path__)
接著,只要編輯該文件并將{{ site_header|default:_('Django administration') }}替換成自己認為適合的名字就行了,例如:{{ _('Polls administration') }}。此處只是個示范,在真正的項目中,你將可能用 django.contrib.admin.AdminSite.site_header 屬性來更輕易地進行自己獨特的自定義。
該模版包含了大量的文字,比如:{% block branding %} 和 {{ title }}。{% 和 {{ 標記是 Django 模板語言的一部分。當 Django 呈現 admin/base_site.html 時,根據模板語言生成最終的 HTML 頁面。
注意 :Django 默認的管理網站中的任何模板都是可覆蓋的。 要覆蓋一個模板,只需要像剛才處理 base_site.html 一樣 ——從默認的目錄下復制到你的自定義目錄下,并修改它。
自定義應用模版
如果 TEMPLATE_DIRS 默認的情況下是空值, 那 Django 是如何找到默認的管理網站的模板的? 答案就是在默認情況下, Django 會自動在每一個應用的包內查找 templates/ 目錄,作為備用使用。 (不要忘記django.contrib.admin 是一個應用)。
我們的 poll 應用不是很復雜并不需要自定義管理模板。但是如果它變得更復雜 而且為了一些功能需要修改 Django 的標準管理模板,修改應用模板將是更 明智的選擇,而不是修改項目模板。通過這種方式,你可以在任何新項目包括 polls 應用中自定義模板并且放心會找到需要的自定義的模板的。
自定義管理首頁
默認情況下,首頁會顯示在 INSTALLED_APPS 中所有注冊了管理功能的應用, 并按字母排序。你可能想在頁面布局上做大修改。總之,首頁可能是管理網站中最重要的頁面, 因此它應該很容易使用。
你需要自定義的模板是 admin/index.html 。 (同先前處理 admin/base_site.html 一樣 – 從默認目錄下復制到你自定義的模板目錄下。) 編輯這個文件,你將看到一個名為 app_list 的模板變量。這個變量包含了每一個 已安裝的 Django 應用。你可以通過你認為最好的方法硬編碼鏈接到特定對象的管理頁面,而不是使用默認模板。
參考:https://docs.djangoproject.com/en/1.7/intro/tutorial02/
未完待續。。。。
新聞熱點
疑難解答