關於擴展django管理模板的一個(不是那麼簡單)的問題。擴展Django管理模板 - 更改更改列表
我試圖通過在包含與該對象相關的某些對象的結果行(row1和row2類)之間添加中間行來更改特定模型的結果列表(更改django術語列表)。
我搜索了代碼,但還沒有找到辦法做到這一點。任何指針都非常感謝。代碼也將有所幫助。 PS:我知道我應該設計我自己的界面,但這是一個內部項目,我沒有那麼多時間空閒。另外,django界面非常好。
預先感謝您。
關於擴展django管理模板的一個(不是那麼簡單)的問題。擴展Django管理模板 - 更改更改列表
我試圖通過在包含與該對象相關的某些對象的結果行(row1和row2類)之間添加中間行來更改特定模型的結果列表(更改django術語列表)。
我搜索了代碼,但還沒有找到辦法做到這一點。任何指針都非常感謝。代碼也將有所幫助。 PS:我知道我應該設計我自己的界面,但這是一個內部項目,我沒有那麼多時間空閒。另外,django界面非常好。
預先感謝您。
第1步:重寫變更列表視圖:
你必須覆蓋一個模板,而不是指定一個像您可以用add_view/change_view
。
首先第一件事,覆蓋 def changelist_view(self, request, extra_context=None):
在您的ModelAdmin
。請記得致電super(foo, self).changelist_view(request, extra_context)
並返回。
步驟2:覆蓋模板:
接下來,重寫應用程序特定的變更表模板在templates/admin/my_app/my_model/change_list.html
(或不..你可以使用全局變更列表覆蓋太多,如果你願意)。
第3步:複製結果列表功能
我想你可以複製result_list
功能(定義一個新的模板標籤)或僞造它通過複製和粘貼功能result_list和模板包括到您的視圖。
# django.contrib.admin.templatetags.admin_list
def result_list(cl):
"""
Displays the headers and data list together
"""
return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': list(result_headers(cl)),
'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
你可以看到管理員使用此admin/change_list_results.html
模版來表現各個列,所以你需要使用的方法之一來替換這個模板標籤。
因爲它正在尋找一個全球模板,我不會重寫它。
無論是定義一個新的標籤瓦特/新模板專門爲您的觀點,或直接發送result_list(cl)
您的模板並採用admin/change_list_results.html
用於直接在change_list.html
模板。
這工作就像一個魅力。我不得不在result_list(cl)中調試cl的屬性。除此之外 - 非常感謝! :-) – Weholt 2011-03-09 18:56:44
爲了擴大對虞姬的回答,下面是壓倒一切的change_list_results.html
一些具體...
覆蓋changelist_view
如上步驟1中,也描述here at djangoproject。 或通過放置在上面的步驟2中相應的目錄中自動覆蓋。 (請注意,上面顯示的第2步路徑是特定於模型的,在TEMPLATE_DIRS元組中定義的任何目錄下的應用程序特定應爲/admin/<MyAppName>/change_list.html
。)
或者(也許更容易)只需指定ModelAdmin.change_list_template
與任何發現模板文件名解釋here。 (雖然,如果您保留名稱change_list.html
,一定不要直接存入/admin
文件夾,否則extends
標籤會導致遞歸。)
class MyModelAdmin(admin.ModelAdmin):
change_list_template = 'change_list.html' # definitely not 'admin/change_list.html'
# ...
在你change_list.html
模板中,有一個最小化
{% extends "admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load myapptags %}
{% block result_list %}
{% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
{% result_list cl %}
{% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
{% endblock %}
創建/<MyAppName>/templatetags
包(含有__init__.py
的目錄)用相對應的文件到負載標籤上述
# MyAppName/templatetags/myapptags.py
from django import template
from django.contrib.admin.templatetags.admin_list import result_list
register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)
複製並編輯Django的change_list_results.html
(如例如上面的my_change_list_results.html
)使用您的附加功能。
請注意,這些步驟不包括模板的額外上下文,但可以很容易地進行擴展。 (我這樣做的原因是爲了增加對CSS和類領先<tbody>
,這不是對結果列表進行排序。)
附加:
要包括額外的上下文,改變你的templatetags模塊如下:(
# MyAppName/templatetags/myapptags.py
from django import template
from django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list
def result_list(cl):
mycl = {'myextracontext': 'something extra'}
mycl.update(foo_extra())
mycl.update(admin_list_result_list(cl))
return mycl
register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)
然後,myextracontext
或任何foo_extra
返回值可以被包含在結果模板如{{ myextracontext }}
)
我不明白這個答案的結構! – Pranab 2016-11-17 04:56:22
存在一些admin.py的功能,可以幫助您覆蓋常規方法... [在此處查看](http://docs.djangoproject.com/zh/dev/ref/contrib/admin/ #其他方法)...他們可能會幫助你... – FallenAngel 2011-01-25 14:29:05