我正在开发Django项目,我需要从Django Admin的用户屏幕中提取用户列表。我将actions
变量添加到我的Sample Class中,以便在每个用户的id之前获取CheckBox。
class SampleClass(admin.ModelAdmin):
actions =[make_published]
已定义动作make_published。现在我想在Add user
按钮旁边添加另一个按钮,如图2所示。 。但我不知道如何在不使用新模板的情况下实现这一目标。我想使用该按钮将所选用户数据打印到excel。谢谢,请指导我。
答案 0 :(得分:31)
将其放入该模板
{% extends "admin/change_list.html" %}
{% block object-tools-items %}
{{ block.super }}
<li>
<a href="export/" class="grp-state-focus addlink">Export</a>
</li>
{% endblock %}
在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"])
将新网址添加到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
享受;)
答案 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
为此进行管理员操作,添加自定义按钮距离“过度定制”更近了一步,这意味着可能是时候编写自己的视图了。
的引用管理员有许多用于自定义的钩子,但要注意尝试专门使用这些钩子。如果您需要提供一个更加以流程为中心的接口来抽象出数据库表和字段的实现细节,那么可能是时候编写自己的视图了。
答案 2 :(得分:0)
easy 和接受方式是覆盖模板。
如果您不想弄乱Django模板,可以向管理员添加Media
类并添加一些javascript来创建按钮,虽然我认为使用javascript创建元素有点讨厌,应该要避免。