2

Django admin でカスタマイズされた機能をカプセル化するために、実際には次のようなカスタムModelAdminクラスを提供しています。

class ArticleAdmin(admin.ModelAdmin):
    class Media:
        js = ("my_code.js",)

は追加ページと変更ページの両方でロードされることに注意しmy_code.jsましたが、追加ページでのみロードする必要があります。これを行うことは可能ですか(そしてどのように)?

4

2 に答える 2

6

StackOverflow が古い投稿を掘り下げるのが好きかどうかはわかりませんが、私はこれが自分の問題について調査を行っていることを発見し、受け入れられた回答よりもわずかに洗練された解決策を見つけました。メソッドをオーバーライドして、定義render_change_formを更新できます。context['media']この質問のサンプル:

def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
    if add:
        if context.has_key('media'):
            old_media = context['media']
        else:
            old_media = forms.Media()
        context.update({'media': old_media+forms.Media(js=("js/SPD_media_admin.js",)) })
    return super(ArticleAdmin,self).render_change_form(request=request, context=context, add=add, change=change, form_url=form_url, obj=obj)

これは Django 1.4 で動作します。関心のある読者は、 メソッドの仕様に合わせてargsとを調整する必要があるかもしれません。は通常、 としてこのメ​​ソッドに渡されません。それ以外の場合は、. これがOPまたは後世に役立つことを願っています。kwargscontextkwargargs

于 2012-10-27T22:04:17.680 に答える
1

残念ながら、含める JavaScript ファイルのリストは、管理アプリケーションのビュー関数から提供されるコンテキスト変数によって生成および割り当てられるため、media簡単にオーバーライドすることはできません。しかし、これはそれほどエレガントではない解決策です。

現在のモデルの管理追加ページでソースを表示し、14 行目から始まる JavaScript ファイルをインポートするスクリプト タグをコピーします (私は Django 1.2 を使用しています)。それらを貼り付ける場所は、以下のコード フラグメントで確認できます。

ディレクトリに独自のカスタムchange_form.htmlテンプレートを作成しtemplates/admin/my_app/article、次の内容をファイルに配置します。

{% extends "admin/change_form.html" %}
{% block extrahead %}
{% url admin:jsi18n as jsi18nurl %}
<script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
{% if add %}
{{ media }}
{% else %}
<!-- originally generated script tags: may differ depending on your model's fields -->
<script type="text/javascript" src="/media/admin/js/core.js"></script>
<script type="text/javascript" src="/media/admin/js/admin/RelatedObjectLookups.js"></script>
<script type="text/javascript" src="/media/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/media/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/media/admin/js/actions.min.js"></script>
<!-- end originally generated script tags -->
{% endif %}
{% endblock %}

たとえば、モデルに日付フィールドを追加すると、必要なcalendar.jsファイルが呼び出されないため、レコードを編集するときにフィールドが変更フォームで適切に機能しないことに注意してください。追加する必要があります。そのような変更を行った場合は手動で。

これをさらに進めて失われたダイナミクスを復元する 1 つの代替方法は、変数を渡してmedia正規表現を使用できるテンプレート フィルターを作成することです。たとえば、不要なスクリプト タグを取り除きます。

于 2011-04-20T03:18:44.307 に答える