web-dev-qa-db-ja.com

Djangoモデルの管理フォームにモデル全体のヘルプテキストを追加する

Djangoアプリで、一部のモデルの管理者変更フォームにカスタマイズされたヘルプテキストを追加できるようにしたいと思います。注私がフィールド固有のhelp_text属性について話しているのではありません個々のフィールドに設定できます。たとえば、My_ModelMy_Appの変更フォームの上部に、「モデルの詳細については http://を参照してください。 example.com "は、内部ドキュメントWikiへのリンクを提供するために使用します。

これを達成する簡単な方法はありますか、またはモデルのカスタム管理フォームを作成する必要がありますか?もしそうなら、私がそれをどのように行うかの例を教えてもらえますか?

47
Jason Jenkins

これを達成するには、かなり単純ですが、文書化されていない方法があります。

Adminクラスでrender_change_formを定義する

まず、管理者に追加のコンテキストを渡す必要があります。これを行うには、管理クラス内でrender_change_form関数を定義できます。例:

# admin.py
class CustomAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
        # here we define a custom template
        self.change_form_template = 'admin/myapp/change_form_help_text.html'
        extra = {
            'help_text': "This is a help message. Good luck filling out the form."
        }

        context.update(extra)
        return super(CustomAdmin, self).render_change_form(request,
            context, *args, **kwargs)

カスタムテンプレートの作成

次に、そのカスタムテンプレート(change_form_help_text.html)を作成し、デフォルトの「admin/change_form.html」を拡張する必要があります。

# change_form_help_text.html
{% extends 'admin/change_form.html' %}
{% block form_top %} 
{% if help_text %}<p>{{ help_text }}</p>{% endif %}
{% endblock %}

このテンプレートをtemplates/admin/myapp /内に配置することを選択しましたが、これも柔軟です。


詳細については、以下をご覧ください。

http://davidmburke.com/2010/05/24/Django-hack-adding-extra-data-to-admin-interface/

http://code.djangoproject.com/wiki/NewformsHOWTO#Q:HowcanIpassextracontextvariablesintomyaddandchangeviews

28
Andy Terra

管理者の fieldsets を使用:

_class MyAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('first', 'second', 'etc'),
            'description': "This is a set of fields group into a fieldset."
        }),
    )
    # Other admin settings go here...
_

管理者は複数のフィールドセットを持つことができます。それぞれに独自のタイトルを付けることができます(上のNoneをタイトルに置き換えます)。 'classes': ('collapse',),をフィールドセットに追加して、折りたたんで開始することもできます(wideクラスはデータフィールドを広くし、他のクラス名は、CSSが言うことを意味します)。

注意してください:description文字列はsafeと見なされるので、そこにクリーニングされていないデータを入れないでください。これは、必要に応じて(リンクのように)マークアップを配置できるように行われますが、ブロックのフォーマット(_<ul>_リストのような)はおそらく正しく表示されません。

63
Mike DeSimone

私があなたが望むことを理解しているなら、以下のコードはあなたが望むことをするべきです。

def __init__(self, *args, **kwargs):
        super(ClassName, self).__init__(*args, **kwargs)
        if siteA:
            help_text = "foo"
        else:
            help_text = "bar"
        self.form.fields["field_name"].help_text = help_text

これは、いくつかのロジックを使用してオーバーライドされたフォームを変更する例です。そのため、オーバーライドしたModelAdminコンストラクタにこれを置くだけです。

2
stormlifter
1