2011-01-25 107 views
20

關於擴展django管理模板的一個(不是那麼簡單)的問題。擴展Django管理模板 - 更改更改列表

我試圖通過在包含與該對象相關的某些對象的結果行(row1和row2類)之間添加中間行來更改特定模型的結果列表(更改django術語列表)。

我搜索了代碼,但還沒有找到辦法做到這一點。任何指針都非常感謝。代碼也將有所幫助。 PS:我知道我應該設計我自己的界面,但這是一個內部項目,我沒有那麼多時間空閒。另外,django界面非常好。

預先感謝您。

+1

存在一些admin.py的功能,可以幫助您覆蓋常規方法... [在此處查看](http://docs.djangoproject.com/zh/dev/ref/contrib/admin/ #其他方法)...他們可能會幫助你... – FallenAngel 2011-01-25 14:29:05

回答

27

第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模板。

+1

這工作就像一個魅力。我不得不在result_list(cl)中調試cl的屬性。除此之外 - 非常感謝! :-) – Weholt 2011-03-09 18:56:44

30

爲了擴大對虞姬的回答,下面是壓倒一切的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 }}

+0

我不明白這個答案的結構! – Pranab 2016-11-17 04:56:22