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