一尘不染

如何在Django管理员更改列表视图页面中添加按钮

django

我想在模型的列表视图中为我的模型的“添加”按钮旁边添加一个按钮,然后创建一个视图函数,在该函数中,我将做我的工作,然后将用户重定向回列表视图。

我已经检查了如何重载管理模板,但我仍然不知道,我应该将视图函数放在哪里做我的事情,以及如何将该视图注册到管理url中。

还有关于安全性的问题。我想在admin内部执行该操作,因此如果您未登录,则无法使用它。


阅读 1103

收藏
2020-04-02

共1个答案

一尘不染

当多个应用程序提供同一资源的不同版本(模板,静态文件,管理命令,转换)时,在INSTALLED_APPS中首先列出的应用程序具有优先权。

确保你的应用已在'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  

该模板应自动提取,但是如果它不在上面列出的路径之一上,则还可以通过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”中,可以这样查找:

{% 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和处理不活动的用户。

2020-04-02