23

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

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

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

4

3 回答 3

37
  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
    

享受 ;)

于 2013-08-05T07:24:03.900 回答
0

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

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

于 2013-07-31T11:29:10.147 回答
0

尽管其他答案完全有效,但我认为重要的是要注意绝对没有必要添加按钮来获得这种行为。您可以使用管理员操作,就像您对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

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

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

引用自Django Admin 文档的介绍段落

于 2016-07-09T12:43:23.383 回答