在Django应用的管理页面添加自定义按钮

21 投票
5 回答
46893 浏览
提问于 2025-04-16 04:30

我有一个用Django做的应用,这个应用里有一个功能只给管理员使用。我想在管理员的应用部分加一个按钮,让他们可以执行这个功能。

我是不是需要为这个按钮做一个模板?如果是这样的话,我该怎么为管理员的应用添加一个HTML模板呢?或者说有没有什么命令可以直接添加一个按钮?

5 个回答

2

你还可以使用 django-admin-tools,这个工具可以让你轻松地把管理页面自定义成一个像仪表盘一样的界面。通过使用一个叫做 LinkList 的功能,你可以指向某个视图方法,并检查用户是否已经登录。大概是这样的:

# dashboard.py (read more about how to create one on django-admin-tools docs)
class CustomIndexDashboard(Dashboard):
    """
    Custom index dashboard for captr.
    """
    def init_with_context(self, context):
        self.children.append(modules.LinkList(
            _('Tasks'),
            children=[
                ['Your task name', '/task']
            ]
        ))

# urls.py (mapping uri to your view function)
urlpatterns += patterns('yourapp.views',
    (r'^task$', 'task'),
)

# views.py
def task(request):
    if request.user.is_authenticated():
        update_definitions_task.delay() # do your thing here. in my case I'm using django-celery for messaging

    return redirect('/admin')
11

Django1.10:

1) 重写 admin/submit_line.html:

{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
    {% for button in extra_buttons %}
        {{ button }}
    {% endfor %}
{% endif %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />{% endif %}
{% if show_delete_link %}
    {% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />{% endif %}
</div>

这里假设 button 的字符串表示可以被浏览器识别为合适的 inputbutton 元素,并且已经用 django.utils.safestring.mark_safe 标记为安全。你也可以使用 safe 模板过滤器,或者直接访问 button 的属性来构建 <input>。我觉得把这些事情放在 Python 层处理会更好。

2) 重写 MyModelAdmin.change_view:

def change_view(self, request, object_id, form_url='', extra_context=None):
    extra_context = extra_context or self.extra_context()
    return super(PollAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

这个方法让你可以轻松地为任何 ModelAdmin 添加按钮。作为第一步的替代方案,你可以扩展 admin/change_form.html 并重写 submit_row 这个块。这样做会稍微复杂一些,因为模板中需要额外的标签。

如果你希望这个额外的功能在所有模型(或特定的一部分模型)中都可用,那么可以创建一个子类 ModelAdmin,并添加你想要的功能(比如为你的模型添加归档功能)。你甚至可以重写删除按钮和其他默认按钮,让它们变成归档而不是删除;这需要对模板进行一些修改。

15

调整管理员表单可能会有点复杂,但我发现添加链接、按钮或额外信息其实很简单,而且很有帮助。比如,可以添加一个相关对象的链接列表,而不需要把它们放在同一行,特别是对于那些更常被查看而不是编辑的内容。

来自 Django 文档

由于管理员模板的模块化设计,通常不需要也不建议替换整个模板。几乎总是更好只覆盖你需要更改的模板部分。

这样做会在表单的顶部添加一个列表。

放在 templates/admin/[你的应用]/[要覆盖的模板] 中:

{% extends "admin/change_form.html" %}

{% block form_top %}

{% for item in original.items %}
  {{ item }}
{% endfor %}

{% endblock %}

撰写回答