我想在模型的列表视图中为我的模型的“添加”按钮旁边添加一个按钮,然后创建一个视图函数,在该函数中,我将做我的工作,然后将用户重定向回列表视图。
我已经检查了如何重载管理模板,但我仍然不知道,我应该将视图函数放在哪里做我的事情,以及如何将该视图注册到管理url中。
还有关于安全性的问题。我想在admin内部执行该操作,因此如果您未登录,则无法使用它。
当多个应用程序提供同一资源的不同版本(模板,静态文件,管理命令,转换)时,在INSTALLED_APPS中首先列出的应用程序具有优先权。
确保你的应用已在'django.contrib.admin'中列出INSTALLED_APPS。
'django.contrib.admin'
NSTALLED_APPS
change_list.html在以下目录之一中创建模板:
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
该模板应自动提取,但是如果它不在上面列出的路径之一上,则还可以通过admin模型属性来指向它:
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 "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。管理员url名称位于名称空间“ admin”中,可以这样查找:
href="..."
{% 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和处理不活动的用户。
request.user.is_active