web-dev-qa-db-ja.com

Django管理サイトの[ユーザーの追加]ボタンの横にボタンを追加する方法

Django管理者のユーザー画面からExcelにユーザーのリストを抽出する必要があるDjangoプロジェクトに取り組んでいます。各ユーザーのIDの前にCheckBoxを取得するために、サンプルクラスにactions変数を追加しました。

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

アクションmake_publishedはすでに定義されています。次に、図に示すように、Add userボタンの横に別のボタンを追加します。 Admin User Screen。しかし、新しいテンプレートを使用せずにこれをどのように達成できるかわかりません。そのボタンを使用して、選択したユーザーデータをExcelに印刷したいと思います。ありがとう、私を案内してください。

19
Braham Shakti
  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
    

楽しい ;)

32
n1_

他の回答は完全に有効ですが、そのような動作を実現するためにボタンを追加する必要はまったくないことに注意することが重要だと思います。 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管理者用ドキュメントの紹介段落から引用

1
Antoine Pinsard

easyおよびacceptedの方法は、テンプレートをオーバーライドすることです。

Djangoテンプレートをいじりたくない場合は、管理者にMediaクラスを追加し、JavaScriptを追加してボタンを作成できますが、 javascriptは少し厄介なので、避ける必要があります。

0