Django管理用テンプレートの拡張に関する簡単な質問です。
特定のモデルの結果リスト(Django lingo)の変更リスト)を、関連するいくつかのオブジェクトを含む結果行(row1クラスとrow2クラス)の間に中間行を追加して変更しようとしていますそのオブジェクト。
コードを検索しましたが、これを行う方法が見つかりませんでした。どんなポインタでも大歓迎です。コードも役立ちます。
PS:自分のインターフェースを設計する必要があることはわかっていますが、これは内部プロジェクトであり、時間をかける余裕はあまりありません。また、Djangoインターフェースは本当に素晴らしいです。
前もって感謝します。
ユウジの答えをさらに詳しく説明するために、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 }}
)
ステップ1:チェンジリストビューのオーバーライド:
_add_view / change_view
_でできるようにテンプレートを指定するのではなく、テンプレートを上書きする必要があります。
まず最初に、ModelAdmin
のdef 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
_テンプレートで直接使用します。
admin_list
テンプレートタグの完全な上書きが必要な場合は、ここに別のスレッドでの投稿があります。 https://stackoverflow.com/a/55597294/11335685
私はそれがchange_list
テンプレートに直接関係していないことを知っていますが、そのロジックはadmin_list
テンプレートタグ内の関数に基づいています。
そのアプローチの欠点は、特定の関数のみをオーバーライドして他の関数を使用する方法を見つけられなかったことです。
それでも、HTMLテンプレートをいじらず、result_list
関数の動作のみを変更できる唯一の方法でした。
それが誰にも役立つことを願っています。