Django管理者のユーザー画面からExcelにユーザーのリストを抽出する必要があるDjangoプロジェクトに取り組んでいます。各ユーザーのIDの前にCheckBoxを取得するために、サンプルクラスにactions
変数を追加しました。
class SampleClass(admin.ModelAdmin):
actions =[make_published]
アクションmake_publishedはすでに定義されています。次に、図に示すように、Add user
ボタンの横に別のボタンを追加します。 。しかし、新しいテンプレートを使用せずにこれをどのように達成できるかわかりません。そのボタンを使用して、選択したユーザーデータをExcelに印刷したいと思います。ありがとう、私を案内してください。
これをそのテンプレートに入れます
{% 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"])
管理モデルの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
楽しい ;)
他の回答は完全に有効ですが、そのような動作を実現するためにボタンを追加する必要はまったくないことに注意することが重要だと思います。 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
これに対して管理アクションが実行されます。カスタムボタンを追加すると、「過剰カスタマイズ」に一歩近づきます。つまり、独自のビューを作成するときが来たと考えられます。
管理者にはカスタマイズ用のフックがたくさんありますが、それらのフックを排他的に使用しようとしないように注意してください。データベースのテーブルとフィールドの実装の詳細を抽象化する、よりプロセス中心のインターフェイスを提供する必要がある場合は、おそらく独自のビューを作成する必要があります。
easyおよびacceptedの方法は、テンプレートをオーバーライドすることです。
Djangoテンプレートをいじりたくない場合は、管理者にMedia
クラスを追加し、JavaScriptを追加してボタンを作成できますが、 javascriptは少し厄介なので、避ける必要があります。