【问题标题】:How to add button next to Add User button in Django Admin Site如何在 Django 管理站点中的“添加用户”按钮旁边添加按钮
【发布时间】:2013-07-31 21:13:11
【问题描述】:

我正在开发 Django 项目,我需要从 Django Admin 的用户屏幕中提取用户列表以使其表现出色。我在我的示例类中添加了actions 变量,以便在每个用户的 id 之前获取 CheckBox。

class SampleClass(admin.ModelAdmin):
    actions =[make_published]

动作 make_published 已定义。现在我想在Add user 按钮旁边添加另一个按钮,如图所示。 。但我不知道如何在不使用新模板的情况下实现这一点。我想使用该按钮将选定的用户数据打印到 Excel 中。谢谢,请指导我。

【问题讨论】:

    标签: python django django-forms django-templates django-admin


    【解决方案1】:
    1. 在您的模板文件夹中创建一个模板:admin/YOUR_APP/YOUR_MODEL/change_list.html
    2. 把这个放到那个模板里

      {% extends "admin/change_list.html" %}
      {% block object-tools-items %}
      
          {{ block.super }}
      
          <li>
              <a href="export/" class="grp-state-focus addlink">Export</a>
          </li>
      
      {% endblock %}
      
    3. YOUR_APP/admin.py中创建一个视图函数并用注解保护它

      from django.contrib.admin.views.decorators import staff_member_required
      
      @staff_member_required
      def export(self, request):
      
          ... do your stuff ...
      
          return HttpResponseRedirect(request.META["HTTP_REFERER"])
      
    4. 将新 url 添加到 YOUR_APP/admin.py 到管理模型的 url 配置

      from django.conf.urls import patterns, include, url
      
      class YOUR_MODELAdmin(admin.ModelAdmin):
      
          ... list def stuff ...
      
          def get_urls(self):
              urls = super(MenuOrderAdmin, self).get_urls()
              my_urls = patterns("",
                  url(r"^export/$", export)
              )
              return my_urls + urls
      

    享受;)

    【讨论】:

    • 我一直跟进到最后一部分,url(r"^financial-export/$) 是从哪里来的?
    • 你的链接有两个class属性:class="grp-state-focus" class="addlink"
    • 谢谢你,已修复。
    • 对我来说,我不得不把change_list.html放在APP/templates/admin/APP/MODEL/change_list.html
    • 如何从视图中访问模型查询集?
    【解决方案2】:

    简单接受的方式是覆盖模板。

    如果您不想弄乱 Django 模板,您可以向您的管理员添加一个 Media 类并添加一些 javascript 来创建按钮,尽管我认为使用 javascript 创建元素有点讨厌并且应该避免.

    【讨论】:

      【解决方案3】:

      虽然其他答案完全有效,但我认为重要的是要注意绝对没有必要添加按钮来获得这种行为。您可以使用管理员操作,就像对 make_published 操作所做的那样。

      这是不需要覆盖任何模板的优点,因此可以防止升级 django 版本时出现潜在问题(因为管理模板可能会更改,并且更改可能与您覆盖它的方式不“兼容”)。

      import csv
      
      from django.http import HttpResponse
      from django.utils import timezone
      
      def export_as_csv(modeladmin, request, queryset):
          opts = modeladmin.model._meta
          filename = format(timezone.now(), "{app}_{model}-%Y%m%d_%H%M.csv").format(
              app=opts.app_label, model=opts.model_name)
      
          response = HttpResponse(content_type='text/csv')
          response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
      
          writer = csv.writer(response)
          field_names = [f.get_attname() for f in opts.concrete_fields]
          writer.writerow(field_names)
          for obj in queryset.only(*field_names):
              writer.writerow([str(getattr(obj, f)) for f in field_names])
      
          return response
      

      为此进行了管理操作,添加自定义按钮更接近“过度自定义”,这意味着可能是时候编写自己的视图了。

      管理员有许多用于自定义的钩子,但请注意不要尝试专门使用这些钩子。如果您需要提供一个更加以流程为中心的接口来抽象出数据库表和字段的实现细节,那么可能是时候编写自己的视图了。

      引用introduction paragraph of Django Admin's documentation

      【讨论】:

        猜你喜欢
        • 2013-08-16
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 2020-12-04
        • 2016-03-21
        • 1970-01-01
        • 2016-09-05
        • 2022-01-12
        相关资源
        最近更新 更多