当多个应用程序提供相同资源(模板、静态文件、管理命令、翻译)的不同版本时,INSTALLED_APPS 中首先列出的应用程序具有优先权。-关于 INSTALLED_APPS 的 Django 文档
确保您的应用'django.contrib.admin'
在INSTALLED_APPS
.
change_list.html
在以下目录之一中创建模板:
# Template applies to all change lists.
myproject/myapp/templates/admin/change_list.html
# Template applies to change lists in myapp.
myproject/myapp/templates/admin/myapp/change_list.html
# Template applies to change list in myapp and only to the Foo model.
myproject/myapp/templates/admin/myapp/foo/change_list.html
该模板应该会被自动拾取,但如果它不在上面列出的路径之一上,您也可以通过管理模型属性指向它:
class MyModelAdmin(admin.ModelAdmin):
#...
change_list_template = "path/to/change_list.html"
您可以查找它所在的原始 change_list.html 的内容path/to/your/site-packages/django/contrib/admin/templates/admin/change_list.html
。另一个答案还向您展示了如何格式化模板。Nikolai Saiko 向您展示了如何使用 'extends' 和 'super' 覆盖相关部分。概括:
{% extends "admin/change_list.html" %} {% load i18n %}
{% block object-tools-items %}
{{ block.super }}
<li>
<a class="historylink" href="...">My custom admin page</a>
</li>
{% endblock %}
让我们填写href="..."
一个网址。管理员 url 名称位于命名空间 'admin' 中,可以像这样查找:
{% url 'admin:custom_view' %}
当您向 change_form.html 添加按钮时,您可能希望传入当前对象 ID:
{% url 'admin:custom_view' original.pk %}
现在创建一个自定义视图。这可以是常规视图(就像您网站上的其他页面一样)或 admin.py 中的自定义管理视图。ModelAdmin 上的 get_urls 方法以与 URLconf 相同的方式返回要用于该 ModelAdmin 的 URL。因此,您可以按照 URL 调度程序中的说明扩展它们:
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = patterns('',
url(r'^my_view/$', self.my_view, name="custom_view")
)
return my_urls + urls
def my_view(self, request):
# custom view which should return an HttpResponse
pass
# In case your template resides in a non-standard location
change_list_template = "path/to/change_list.html"
阅读有关如何在 ModelAdmin 中设置视图权限的文档:https ://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls
您可以保护您的视图,并且只向具有员工身份的用户授予访问权限:
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def my_view(request):
...
您可能还想检查request.user.is_active
和处理非活动用户。
更新:利用框架并尽可能少地进行定制。很多时候操作可能是一个不错的选择:https ://docs.djangoproject.com/en/1.5/ref/contrib/admin/actions/
更新 2:我删除了一个 JS 示例来注入一个按钮客户端。如果需要,请参阅修订。