web-dev-qa-db-ja.com

拡張Django管理テンプレート-変更リストの変更

Django管理用テンプレートの拡張に関する簡単な質問です。

特定のモデルの結果リスト(Django lingo)の変更リスト)を、関連するいくつかのオブジェクトを含む結果行(row1クラスとrow2クラス)の間に中間行を追加して変更しようとしていますそのオブジェクト。

コードを検索しましたが、これを行う方法が見つかりませんでした。どんなポインタでも大歓迎です。コードも役立ちます。

PS:自分のインターフェースを設計する必要があることはわかっていますが、これは内部プロジェクトであり、時間をかける余裕はあまりありません。また、Djangoインターフェースは本当に素晴らしいです。

前もって感謝します。

23
rsavu

ユウジの答えをさらに詳しく説明するために、change_list_results.htmlのオーバーライドに関する詳細を次に示します...


上記のステップ1で説明されているようにchangelist_viewをオーバーライドし、さらに ここではdjangoproject についても説明します。 Or上記の手順2のように適切なディレクトリに配置することにより、自動オーバーライドします。 (上記のステップ2のパスはモデル固有であることに注意してください。アプリ固有は、TEMPLATE_DIRSタプルで定義された任意のディレクトリの下で/admin/<MyAppName>/change_list.htmlになります。)

または(おそらく簡単)説明どおりにModelAdmin.change_list_templateを指定 こちら 検出可能なテンプレートのファイル名。 (ただし、change_list.htmlという名前を保持する場合は、/adminフォルダーに直接デポジットしないでください。そうしないと、extendsタグによって再帰が発生します。)

class MyModelAdmin(admin.ModelAdmin):
    change_list_template = 'change_list.html' # definitely not 'admin/change_list.html'
    # ...

change_list.htmlテンプレートには、少なくとも

{% extends "admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load myapptags %}

{% block result_list %}
  {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
  {% result_list cl %}
  {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
{% endblock %}

上記のロードタグに対応するファイルを含む/<MyAppName>/templatetagsパッケージ(__init__.pyを含むディレクトリ)を作成します

# MyAppName/templatetags/myapptags.py

from Django import template
from Django.contrib.admin.templatetags.admin_list import result_list

register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)

Djangoのchange_list_results.htmlをコピーして編集し(上記のmy_change_list_results.htmlなど)、追加した機能を使用します。

これらのステップにはテンプレートの追加のコンテキストは含まれていませんが、そのように簡単に拡張できることに注意してください。 (これを行う理由は、CSSのクラスと、結果リストでソートされていない先頭の<tbody>を追加するためでした。)


[〜#〜]追加[〜#〜]

追加のコンテキストを含めるには、templatetagsモジュールを次のように変更します。

# MyAppName/templatetags/myapptags.py

from Django import template
from Django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list

def result_list(cl):
    mycl = {'myextracontext': 'something extra'}
    mycl.update(foo_extra())
    mycl.update(admin_list_result_list(cl))
    return mycl

register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)

次に、myextracontextの値またはfoo_extraが返すものを結果テンプレートに含めることができます(例:{{ myextracontext }}

35
Frank

ステップ1:チェンジリストビューのオーバーライド
_add_view / change_view_でできるようにテンプレートを指定するのではなく、テンプレートを上書きする必要があります。

まず最初に、ModelAdmindef changelist_view(self, request, extra_context=None):をオーバーライドします。 super(foo, self).changelist_view(request, extra_context)を呼び出し、それを返すことを忘れないでください。

ステップ2:テンプレートの上書き
次に、_templates/admin/my_app/my_model/change_list.html_でアプリ固有のチェンジリストテンプレートをオーバーライドします(そうでない場合は、グローバルチェンジリストオーバーライドを使用することもできます)。

ステップ3:結果リストのコピー機能
_result_list_機能(新しいテンプレートタグを定義)をコピーするか、result_list関数とテンプレートインクルードをコピーしてビューに貼り付けて偽造できると思います。

_# Django.contrib.admin.templatetags.admin_list
def result_list(cl):
    """
    Displays the headers and data list together
    """
    return {'cl': cl,
            'result_hidden_fields': list(result_hidden_fields(cl)),
            'result_headers': list(result_headers(cl)),
            'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
_

管理者がこの_admin/change_list_results.html_テンプレートを使用して個々の列をレンダリングしていることがわかるので、このテンプレートタグを置き換えるには、いずれかのメソッドを使用する必要があります。

グローバルテンプレートを探しているので、オーバーライドしません。

ビューに固有の新しいテンプレートを使用して新しいタグを定義するか、result_list(cl)をテンプレートに直接送信し、_admin/change_list_results.html_を採用して_change_list.html_テンプレートで直接使用します。

33

admin_listテンプレートタグの完全な上書きが必要な場合は、ここに別のスレッドでの投稿があります。 https://stackoverflow.com/a/55597294/11335685

私はそれがchange_listテンプレートに直接関係していないことを知っていますが、そのロジックはadmin_listテンプレートタグ内の関数に基づいています。

そのアプローチの欠点は、特定の関数のみをオーバーライドして他の関数を使用する方法を見つけられなかったことです。

それでも、HTMLテンプレートをいじらず、result_list関数の動作のみを変更できる唯一の方法でした。

それが誰にも役立つことを願っています。