編寫你的第一個 Django 應(yīng)用,第 7 部分?這篇教程承接 教程第 6 部分 結(jié)束的地方。我們繼續(xù)修改在線投票應(yīng)用,這次我們專注于自定義我們在 教程第 2 部分 初見過的 Django 自動生成后臺的過程。 自定義后臺表單?通過 讓我們通過重排列表單上的字段來看看它是怎么工作的。用以下內(nèi)容替換 polls/admin.py?
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
你需要遵循以下流程——創(chuàng)建一個模型后臺類,接著將其作為第二個參數(shù)傳給 以上修改使得 "Publication date" 字段顯示在 "Question" 字段之前:
這在只有兩個字段時顯得沒啥卵用,但對于擁有數(shù)十個字段的表單來說,為表單選擇一個直觀的排序方法就顯得你的針很細(xì)了。 說到擁有數(shù)十個字段的表單,你可能更期望將表單分為幾個字段集: polls/admin.py?
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
添加關(guān)聯(lián)的對象?好了,現(xiàn)在我們有了投票的后臺頁。不過,一個 好了。 有兩個方法可以解決這個問題。第一個就是仿照我們向后臺注冊 polls/admin.py?
from django.contrib import admin from .models import Choice, Question # ... admin.site.register(Choice) 現(xiàn)在 "Choices" 在 Django 后臺頁中是一個可用的選項了?!疤砑舆x項”的表單看起來像這樣:
在這個表單中,"Question" 字段是一個包含數(shù)據(jù)庫中所有投票的選擇框。Django 知道要將 同時也注意下 "Question" 旁邊的“添加”按鈕。每個使用 不過,這是一種很低效地添加“選項”的方法。更好的辦法是在你創(chuàng)建“投票”對象時直接添加好幾個選項。讓我們實現(xiàn)它。 移除調(diào)用 polls/admin.py?
from django.contrib import admin
from .models import Choice, Question
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
這會告訴 Django:“ 加載“添加投票”頁面來看看它長啥樣:
它看起來像這樣:有三個關(guān)聯(lián)的選項插槽——由 在三個插槽的末端,你會看到一個“添加新選項”的按鈕。如果你單擊它,一個新的插槽會被添加。如果你想移除已有的插槽,可以點擊插槽右上角的X。注意,你不能移除原始的 3 個插槽。以下圖片展示了一個已添加的插槽:
不過,仍然有點小問題。它占據(jù)了大量的屏幕區(qū)域來顯示所有關(guān)聯(lián)的 polls/admin.py?
class ChoiceInline(admin.TabularInline):
#...
通過
注意這里有一個額外的“刪除?”列,這允許移除通過“添加新選項”按鈕添加的,或是已被保存的行。 自定義后臺更改列表?現(xiàn)在投票的后臺頁看起來很不錯,讓我們對“更改列表”頁面進(jìn)行一些調(diào)整——改成一個能展示系統(tǒng)中所有投票的頁面。 以下是它此時的外觀:
默認(rèn)情況下,Django 顯示每個對象的 polls/admin.py?
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date')
為了更好用,讓我們也包含 教程第 2 部分 中的 polls/admin.py?
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')
現(xiàn)在修改投票的列表頁看起來像這樣:
你可以點擊列標(biāo)題來對這些行進(jìn)行排序——除了 你可以通過給這個方法(在 polls/models.py?
class 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 = True
was_published_recently.short_description = 'Published recently?'
更多關(guān)于這些方法屬性的信息,參見 再次編輯文件 list_filter = ['pub_date'] 這樣做添加了一個“過濾器”側(cè)邊欄,允許人們以
展示的過濾器類型取決你你要過濾的字段的類型。因為 這已經(jīng)弄的很好了。讓我們再擴充些功能: search_fields = ['question_text'] 在列表的頂部增加一個搜索框。當(dāng)輸入待搜項時,Django 將搜索 現(xiàn)在是給你的修改列表頁增加分頁功能的好時機。默認(rèn)每頁顯示 100 項。 自定義后臺界面和風(fēng)格?在每個后臺頁頂部顯示“Django 管理員”顯得很滑稽。這只是一串占位文本。 不過,這可以通過 Django 的模板系統(tǒng)很方便的修改。Django 的后臺由自己驅(qū)動,且它的交互接口采用 Django 自己的模板系統(tǒng)。 自定義你的 工程的 模板?在你的工程目錄(指包含 打開你的設(shè)置文件( mysite/settings.py?
TEMPLATES = [
{
'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',
],
},
},
]
組織模板 就像靜態(tài)文件一樣,我們 可以 把所有的模板文件放在一個大模板目錄內(nèi),這樣它也能工作的很好。但是,屬于特定應(yīng)用的模板文件最好放在應(yīng)用所屬的模板目錄(例如 現(xiàn)在,在 Django 的源文件在哪里? 如果你不知道 Django 源碼在你系統(tǒng)的哪個位置,運行以下命令: $ python -c "import django; print(django.__path__)" ...\> py -c "import django; print(django.__path__)" 接著,用你站點的名字替換文件內(nèi)的 ``{{ site_header|default:_('Django administration') }}``(包含大括號)。完成后,你應(yīng)該看到如下代碼: {% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
我們會用這個方法來教你復(fù)寫模板。在一個實際工程中,你可能更期望使用 這個模板文件包含很多類似 注意,所有的 Django 默認(rèn)后臺模板均可被復(fù)寫。若要復(fù)寫模板,像你修改 自定義你 應(yīng)用的 模板?機智的同學(xué)可能會問: 我們的投票應(yīng)用不是非常復(fù)雜,所以無需自定義后臺模板。不過,如果它變的更加復(fù)雜,需要修改 Django 的標(biāo)準(zhǔn)后臺模板功能時,修改 應(yīng)用 的模板會比 工程 的更加明智。這樣,在其它工程包含這個投票應(yīng)用時,可以確保它總是能找到需要的自定義模板文件。 更多關(guān)于 Django 如何查找模板的文檔,參見 加載模板文檔。 自定義后臺主頁?在類似的說明中,你可能想要自定義 Django 后臺索引頁的外觀。 默認(rèn)情況下,它展示了所有配置在 需要自定義的模板是 接下來要做什么??初學(xué)者教程到這就結(jié)束了。隨后,你可能想閱讀 下一步看什么,看看下一步能做什么。 如果你很熟悉 Python 打包,且對學(xué)習(xí)如何把投票應(yīng)用改成“可復(fù)用應(yīng)用”感興趣,查看 進(jìn)階教程:如何創(chuàng)建可復(fù)用應(yīng)用。 |
|
|