如何在Django管理站点中添加“添加用户”按钮旁边的按钮

时间:2013-07-31 11:13:15

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

我正在开发Django项目,我需要从Django Admin的用户屏幕中提取用户列表。我将actions变量添加到我的Sample Class中,以便在每个用户的id之前获取CheckBox。

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

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

3 个答案:

答案 0 :(得分:31)

  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. 将新网址添加到YOUR_APP/admin.py到管理模型的网址配置

    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
    
  5. 享受;)

答案 1 :(得分:1)

虽然其他答案完全有效,但我认为重要的是要注意,绝对没有必要添加按钮来获取此类行为。您可以像执行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

的引用

答案 2 :(得分:0)

easy 接受方式是覆盖模板。

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