【问题标题】:Add a custom button to a Django application's admin page将自定义按钮添加到 Django 应用程序的管理页面
【发布时间】:2011-04-16 09:29:27
【问题描述】:

我在 Django 中有一个应用程序,其中包含一个仅对管理员可用的例程。我想要做的是在管理应用程序的这个应用程序部分添加一个按钮来执行例程。

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

【问题讨论】:

标签: python django django-admin


【解决方案1】:

处理管理表单可能很复杂,但我通常发现添加链接、按钮或额外信息既简单又有用。 (就像没有内联的相关对象的链接列表,尤其是查看多于编辑的内容)。

来自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 %}

【讨论】:

    【解决方案2】:

    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 的属性来构造&lt;input&gt;。在我看来,最好将这些东西隔离到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 进行子类化(例如,将归档添加到模型中。您甚至可以为删除添加覆盖-- 和其他默认按钮 -- 以便模式被存档而不是被删除;这需要一些模板修改)

    【讨论】:

      【解决方案3】:

      您还可以使用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')
      

      【讨论】:

        【解决方案4】:

        如果合适,您可以考虑为此类对象添加一个自定义管理操作(类似于内置的“删除”)。一些好处包括:“纯 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

        【讨论】:

          【解决方案5】:

          不要乱用管理页面。

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

          2. 此应用程序在 models.py 中没有任何新内容。没有新型号。零行代码。

          3. 此应用程序在urls.py 中有一个有用的 URL。可用于显示此管理页面的东西。一个网址。代码行数不多(不到十几行。)

          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 是一个测试用例,有两个用户,一个是管理员,一个不是管理员。

          不要弄乱内置的管理页面。

          【讨论】:

          • 即使在创建新应用程序时,该应用程序也可以选择为其模型关联管理页面。所以说“只是创建一个新应用程序”完全没有抓住重点。
          • @Cerin:“所以说“只是创建一个新应用程序”完全没有抓住重点”。可能。您能否提供一个没有完全忽略要点的答案?
          • 接受的答案也没有回答问题,至少没有直接回答。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-19
          • 1970-01-01
          • 2015-01-06
          • 2014-10-21
          • 2016-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多