Django 1.10中文文档-自定义管理站点(django)
開發(fā)第一個Django應(yīng)用,Part7
本教程上接Part6。將繼續(xù)完成這個投票應(yīng)用,本節(jié)將著重講解如果用Django自動生成后臺管理網(wǎng)站。
自定義管理表單
通過admin.site.register(Question)注冊了Question后,Django可以自動構(gòu)建一個默認的表單。如果您需要自定義管理表單的外觀和功能。你可以在注冊時通過配置來實現(xiàn)。
現(xiàn)在先來試試重新排序表單上的字段。只需要將admin.site.register(Question)所在行替換為:
# polls/admin.pyfrom django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):fields = ['pub_date', 'question_text'] admin.site.register(Question, QuestionAdmin)
登錄后復制
你可以參照上面的形式,創(chuàng)建一個模型類,將之作為第二個參數(shù)傳入admin.site.register()。而且這種操作在任何時候都可以進行。
經(jīng)過上面修改”Publication date”字段會在”Question”字段前面:
目前的表單只有兩個字段可能看不出什么,但是對于一個字段很多的表單,設(shè)計一個直觀合理的排序方式非常重要。并且在字段數(shù)據(jù)很多時,還可以將表單分割成多個字段的集合:
# polls/admin.pyfrom django.contrib import adminfrom .models import Questionclass QuestionAdmin(admin.ModelAdmin):fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
登錄后復制
字段集合中每一個元組的第一個元素是該字段集合的標題。它讓頁面看起來像下面的樣子:
添加關(guān)聯(lián)對象
現(xiàn)在Question的管理頁面有了,但是一個Question應(yīng)該有多個Choices。而此時管理頁面并沒有顯示。現(xiàn)在有兩個方法可以解決這個問題。一是就像剛剛Question一樣也將Choice注冊到admin界面。代碼像這樣:
# polls/admin.pyfrom django.contrib import adminfrom .models import Choice, Question# ...admin.site.register(Choice)
登錄后復制
現(xiàn)在Choice也可以在admin頁面看見了,其中”Add choice”表單應(yīng)該類似這樣:
在這個表單中,Question字段是一個select選擇框,包含了當前數(shù)據(jù)庫中所有的Question實例。Django在admin站點中,自動地將所有的外鍵關(guān)系展示為一個select框。在我們的例子中,目前只有一個question對象存在。
請注意圖中的綠色加號,它連接到Question模型。每一個包含外鍵關(guān)系的對象都會有這個綠色加號。點擊它,會彈出一個新增Question的表單,類似Question自己的添加表單。填入相關(guān)信息點擊保存后,Django自動將該Question保存在數(shù)據(jù)庫,并作為當前Choice的關(guān)聯(lián)外鍵對象。通俗講就是,新建一個Question并作為當前Choice的外鍵。
但是,實話說,這種創(chuàng)建方式的效率不怎么樣。如果在創(chuàng)建Question對象的時候就可以直接添加一些Choice,那樣操作將會變得簡單些。
刪除Choice模型對register()方法的調(diào)用。然后,編輯Question的注冊代碼如下:
# polls/admin.pyfrom django.contrib import adminfrom .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管理頁面進行編輯,默認情況,請?zhí)峁?個Choice對象的編輯區(qū)域。
現(xiàn)在”增加question”頁面變成了這樣:
它的工作機制是:這里有3個插槽用于關(guān)聯(lián)Choices,而且每當你重新返回一個已經(jīng)存在的對象的“Change”頁面,你又將獲得3個新的額外的插槽可用。
在3個插槽的最后,還有一個“Add another Choice”鏈接。點擊它,又可以獲得一個新的插槽。如果你想刪除新增的插槽,點擊它右上方的X圖標即可。但是,默認的三個插槽不可刪除。下面是新增插槽的樣子:
但是現(xiàn)在還有個小問題。上面頁面中插槽縱隊排列的方式需要占據(jù)大塊的頁面空間,看起來很不方便。為此,Django提供了一種扁平化的顯示方式,你僅僅只需要將ChoiceInline繼承的類改為admin.TabularInline:
# polls/admin.pyclass ChoiceInline(admin.TabularInline):#...
登錄后復制
使用TabularInline代替`StackedInline``,相關(guān)的對象將以一種更緊湊的表格形式顯示出來:
注意,這樣多了一個”刪除”選項,它允許你刪除已經(jīng)存在的Choice.
自定義修改列表
現(xiàn)在Question的管理頁面看起來已經(jīng)差不多了,下面來看看修改列表頁面,也就是顯示了所有question的頁面,即下圖這個頁面:
Django默認只顯示str()方法指定的內(nèi)容。如果我們想要同時顯示一些別的內(nèi)容,可以使用list_display屬性,它是一個由多個字段組成的元組,其中的每一個字段都會按順序顯示在頁面上,代碼如下:
# polls/admin.pyclass QuestionAdmin(admin.ModelAdmin):# ...list_display = ('question_text', 'pub_date')
登錄后復制
同時,還可以把Part2中的was_published_recently()方法也加入進來:
# polls/admin.pyclass QuestionAdmin(admin.ModelAdmin):# ...list_display = ('question_text', 'pub_date', 'was_published_recently')
登錄后復制
現(xiàn)在question的修改列表頁面看起來像這樣:
你可以點擊其中一列的表頭來讓列表按照這列的值來進行排序,但是was_published_recently這列的表頭不行,因為Django不支持按照隨便一個方法的輸出進行排序。另請注意,默認情況下,was_published_recently的列標題是方法的名稱(下劃線替換為空格),內(nèi)容則是輸出的字符串表示形式。
可以通過給方法提供一些屬性來改進輸出的樣式,就如下面所示:
# polls/models.pyclass Question(models.Model):# ...def was_published_recently(self):now = timezone.now()return now - datetime.timedelta(days=1) <= self.pub_date <= now
was_published_recently.admin_order_field = 'pub_date'was_published_recently.boolean = Truewas_published_recently.short_description = 'Published recently?'
登錄后復制
關(guān)于這些方法屬性的更多信息,請參見list_display。
我們還可以對顯示結(jié)果進行過濾,通過使用list_filter屬性。在QuestionAdmin中添加下面的代碼:
list_filter = ['pub_date']
登錄后復制
它添加了一個“過濾器”側(cè)邊欄,這樣就可以通過pubdate字段來過濾顯示question:
過濾器顯示的篩選類型取決與你過濾的字段,由于pub_data是DateTimeField,所以Django就自動給出了“今天”、“過去7天”、“本月”、“今年”這幾個選項。
這一切進展順利。再添加一些搜索功能:
search_fields = ['question_text']
登錄后復制
這行代碼在修改列表的頂部添加了一個搜索框。 當進行搜索時,Django將在question_text字段中進行搜索。 你在search_fields中使用任意數(shù)量的字段,但由于它在后臺使用LIKE進行查詢,盡量不要添加太多的字段,不然會降低數(shù)據(jù)庫查詢能力。
修改列表自帶分頁功能,默認每頁展示100條數(shù)據(jù)。
自定義管理站點外觀
很明顯,在每一個admin頁面坐上頂端都顯示“Django 管理”是感覺很荒誕,它僅僅是個占位文本。利用Django的模板系統(tǒng),可以易修改它。
它可以用Django的模板系統(tǒng)輕松改變。 Django的管理站點是用Django自己制作出來的,它的界面代碼使用的是Django自己的模板系統(tǒng)。
自定義項目模板
在項目的路勁下(包含manage.py的目錄)創(chuàng)建一個名為templates目錄。Templates可以放在你的文件系統(tǒng)中Django所能訪問到的任何地方。(運行Web服務(wù)器的用戶即是運行Django的用戶)。然而,但是作為一個好的習慣,最好把模板放在本項目目錄下。
在配置文件中(mysite/settings.py)在TEMPLATES中添加一個DIRS選項:
# mysite/settings.pyTEMPLATES = [
{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',
],
},
},
]
登錄后復制
DIRS是在加載Django模板時檢查的文件系統(tǒng)目錄列表;它是一個搜索路徑。
模板組織方式:就像靜態(tài)文件一樣,我們可以把所有的模板都放在一起,形成一個大大的模板文件夾,并且工作正常。但是不建議這樣!最好每一個模板都應(yīng)該存放在它所屬應(yīng)用的模板目錄內(nèi)(例如polls/templates)而不是整個項目的模板目錄(templates),因為這樣每個應(yīng)用才可以被方便和正確的重用。請參考如何重用apps]()。
接下來,在剛才創(chuàng)建的templates中創(chuàng)建一個admin目錄,將admin/base_site.html模板文件拷貝到該目錄內(nèi)。這個html文件來自Django源碼,它位于django/contrib/admin/templates目錄內(nèi)。
如何找到Django源文件: 在命令行中運行下面代碼:
python -c "import django; print(django.__path__)"
然后替換文件中的{{ site_header|default:_('Django administration') }}(包括兩個大括號),換成你想要命名的名字即可。編輯完成后應(yīng)該類似下面的代碼片段:
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
登錄后復制
這里僅僅是使用這種方法來教您如何覆蓋模板。在實際的項目中,您可以使用django.contrib.admin.AdminSite。siteheader屬性更容易實現(xiàn)這個特殊的定制。
在這個模板文件中有許多類似這樣的文本{% block branding %}、{{ title }}。{%和{{都是Django模板語法的一部分。當Django渲染admin/base_site.html的時候,這個模板語言將被生成最終的html頁面,就像Part3中一樣。
注意任何Django管理站點的默認模板都可以重寫。 想要重寫一個模板文件,只需要做和重寫base_site.html相同的操作就行——將它從默認的目錄拷貝到你自定義的目錄中,然后修改它。
自定義應(yīng)用模板
聰明的讀者可能會問:但是DIRS默認是空的,Django是如何找到默認的admin模板呢?回答是,由于APP_DIRS被設(shè)置為`True``,Django將自動查找每一個應(yīng)用路徑下的templates/子目錄(不要忘了django.contrib.admin也是一個應(yīng)用)。
我們的投票應(yīng)用不太復雜,因此不需要自定義admin模板。但是如果它變得越來越復雜,因為某些功能而需要修改Django的標準admin模板,那么修改的模板就比修改項目的模板更加明智。這樣的話,你可以將投票應(yīng)用加入到任何新的項目中,并且保證能夠找到它所需要的自定義模板。更多關(guān)于Django如何加載模板文件的信息,請查看模板加載 (0%)的文檔。
自定義管理站點首頁
在類似的情況下,您可能想要定制Django管理首頁頁面。默認情況下,管理站點首頁顯示所有INSTALLED_APPS內(nèi)并在admin應(yīng)用中注冊過的app,以字母順序進行排序。
要定制管理站點首頁,需要重寫admin/index.html模板,就像前面修改base_site.html模板的方法一樣,從源碼目錄拷貝到你指定的目錄內(nèi)。編輯該文件,你會看到文件內(nèi)使用了一個app_list模板變量。該變量包含了所有已經(jīng)安裝的Django應(yīng)用。你可以硬編碼鏈接到指定對象的admin頁面,使用任何你認為好的方法,用于替代這個app_list。
快速通道
-
Django 1.10中文文檔-第一個應(yīng)用Part1-請求與響應(yīng)
-
Django 1.10中文文檔-第一個應(yīng)用Part2-模型和管理站點
-
Django 1.10中文文檔-第一個應(yīng)用Part3-視圖和模板
-
Django 1.10中文文檔-第一個應(yīng)用Part4-表單和通用視圖
-
Django 1.10中文文檔-第一個應(yīng)用Part5-測試
-
Django 1.10中文文檔-第一個應(yīng)用Part6-靜態(tài)文件
-
Django 1.10中文文檔-第一個應(yīng)用Part7-自定義管理站點
文檔地址
以上就是Django 1.10中文文檔-自定義管理站點的詳細內(nèi)容,更多請關(guān)注風君子博客其它相關(guān)文章!
總結(jié)
以上是生活随笔為你收集整理的Django 1.10中文文档-自定义管理站点(django)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql reflush pri_My
- 下一篇: 如何查看数据库版本(如何在阿里云服务器安