将自定义按钮添加到Django应用程序的管理页面

问题描述:

我在Django中有一个应用程序,只有管理员可以使用该应用程序。我想要做的是添加一个按钮来执行管理应用程序的这个应用程序部分中的例程。将自定义按钮添加到Django应用程序的管理页面

我应该为它制作一个模板,如果是这样的话,我该如何在管理中添加一个应用程序的html模板。或者,也许有一个简单地添加按钮的命令?

+1

为什么不创建一个需要管理员登录的单独页面?这通常比搞乱管理页面简单。 – 2010-09-23 17:06:20

+0

自定义按钮的另一种替代方法是管理员操作https://docs.djangoproject.com/en/1。10/ref/contrib/admin/actions/ – Wtower 2017-04-16 19:04:04

与管理表单混淆可能会很复杂,但我通常发现添加链接,按钮或额外的信息很容易和有帮助。 (就像没有内联的相关对象的链接列表一样,尤其是那些比被编辑的视角更多的东西)。

Django docs

由于管理模板的模块化设计,它通常是 既无必要,也建议 更换整个模板。这是 几乎总是更好只覆盖 您需要更改模板的部分。

这将在窗体顶部添加一个列表。

放置在templates/admin/[your_app]/[template_to_override]

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

{% block form_top %} 

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

{% endblock %} 

不要搞乱管理页面。

  1. 为此创建一个“应用程序”。是的,你的功能只是一个“常规”。没关系。许多小型应用程序是一件好事。

  2. 此应用程序在models.py没有新的东西。没有新模型。零线代码。

  3. 此应用的有用网址在urls.py。一些可用于显示此管理页面的内容。一个网址。没有很多代码行(不到十几个)。

  4. 此应用程序在views.py中有一个查看功能。在“GET”上,该视图函数呈现该表单。在“POST”上,这个视图函数执行“例程”。这是你的应用程序的“心脏”。 GET - 当然 - 只是返回模板来显示。 POST完成真正的工作,并返回最终状态或其他内容。

此视图函数受装饰器保护,以便只有管理员才能执行它。 见http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test。你想写一个测试成为管理员。可能是lambda u: u.is_staff

  1. 此应用程序有一个模板,由GET和POST提供。该模板具有您的按钮的形式。无法轻松添加到管理员的人。

  2. tests.py是一个包含两个用户的测试用例,一个是管理员,另一个不是管理员。

没有搞乱内置的管理页面。

+4

即使在创建新的应用程序时,该应用程序也可以选择为其模型建立关联的管理页面。所以说“只是创建一个新的应用程序”完全忽略了这一点。 – Cerin 2011-03-15 19:38:11

+1

@Cerin:“所以说”只是创建一个新的应用程序“完全忽略了这一点”。也许。你能否提供一个完全不会错过这个观点的答案? – 2011-03-15 19:54:08

+0

@Cerin哪一个是被接受的答案? – Yang 2014-08-13 05:31:59

您还可以使用django-admin-tools,使您可以轻松地自定义管理头版就像一个仪表盘。使用链接列表,您可以指向某种查看方法并检查用户是否已通过身份验证。它是这样的Thies:

# 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') 

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容易。作为步骤(1)的替代,您可以扩展admin/change_form.html并覆盖区块submit_row。由于模板中需要额外的标签,这将稍微冗长些。

如果您希望在所有模型(或特定子集)中使用额外的操作,然后使用所需的功能子类ModelAdmin(一个示例是将存档添加到模型中,您甚至可以添加覆盖 - - 和其他默认按钮 - 使模式存档,而不是删除;这将需要一些模板修改)

+2

应该是一个被接受的答案。 – 2017-02-06 23:55:58

您可能会考虑添加一个定制管理操作这种类型的对象(类似于内置'删除'),如果适当的话。一些好处包括:“纯粹的Django”,无需混淆模板,并且能够一次处理多个对象。

Django的管理让你写并注册的“行动” - 简单 函数被调用与 列表页面上选择对象的列表。如果您查看管理员中的任何更改列表,您将会在 的行为中看到此功能; Django附带一个“删除选中的 对象”操作,适用于所有型号。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

我从这篇文章对如何添加自定义操作按钮,这是另一种答案都在一起的想法。尽管我能够通过更简单的内置操作来解决问题。

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-django-admin-8d266f5b0d41