django admin詳細フォーム表示にカスタムコントロールを追加

3002 ワード

django admin詳細フォーム表示にカスタムコントロールを追加
開発では,詳細表示に外部キーフィールドの内容を追加し,ボタン弾窓の内容を追加し,ボタンジャンプの内容を追加する必要がある.以前は似たような開発はしていませんでしたが、私たちのバックグラウンドはxadminで、当時xadminのプラグインを研究していたので、プラグインでできるかどうか考えていましたが、面倒くさいことに気づきました.まず考え方を説明します.adminにはいくつかのインタフェースがあります.一つは展示されているlistインタフェースで、一つは詳細なmodelインタフェースです.modelには実は詳細detailがあります.中にはこのデータのすべての内容が記録されています.簡単に言えばformフォームの内容展示です.では、これを知っていれば解決できます.私たちはformにいるだけです.pyに対応するフィールドを追加すればいいです.formはwidgetコントロールを持っています.例えば、ボタンを追加して、ユーザーのポイント消費状況を記録したい場合は、クラス名の下で直接追加することができます.
from django.forms import widgets
class AForm(forms.ModelForm):
	point = forms.CharField(
        label=u"      ",
        widget=widgets.TextInput(attrs={'class': '[    css  ]', 'value': '      ',
                                 'style': 'width:100px','type':'button'}),
    )

コードを説明して、まずwidgetsクラスをインポートして、formの中で1つのフィールドを追加して、フィールドの中に1つのwidgetパラメータがあって、私達はその中でコントロールを設定することができて、私は中で1つのinputタイプを追加して、TextInputオブジェクトの中のパラメータattrsは1つの辞書に入って、私達は中でhtmlを書くように関連するcssスタイルを書くことができます.このときbuttonは詳細に見ることができますが、それに対応してdetailのフォームに追加するとaddのフォームにもbuttonが現れます.これは私たちが望んでいるものではありません.buttonをdetailインタフェースにのみ存在させる方法を考えなければなりません.このとき、私たちは__を書き直す必要があります.init__方法:
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
                 initial=None, error_class=ErrorList, label_suffix=None,
                 empty_permitted=False, instance=None, use_required_attribute=None):
         if instance:
             pk = instance.pk
             if not initial:
                 initial = {}
                 // initial['point'] = [value]
                 self.base_fields['point'].widget.input_type = 'button'
         else:
             self.base_fields['point'].widget.input_type = 'hidden'
         super(CustomerUserForm, self).__init__(data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance, use_required_attribute)


superで呼び出しました_init__方法、instanceは作成後のデータの例であり、instaceが存在する場合、idを取得して他の操作を行うことができ、pointがbuttonではなくtext形式のinputであれば、[value]に取得したい値を追加し、attrsでtypeをhiddenに変更することができます.私がselfを呼び出したのが見えます.base_fields[‘point’]というオブジェクトが私たちが作成したbuttonボタンです.
self.base_fieldsは辞書で、私たちがカスタマイズしたフィールド(間違いがあれば自分で見ることができます)を追加し、フィールドnameでフィールドオブジェクトをクエリーし、削除方法でcssスタイルの修正を行うことができます.
Instanceが存在しない場合、オブジェクトがまだ作成されていないことを意味し、addインタフェースにある場合はselfを使用することができます.base_fileds辞書はwidgetオブジェクトを取り出しtypeをhiddenに設定します.
これで、formに追加フィールド表示とbutton操作を追加できます.最後に、typeがtextの場合、valueを直接追加すればいいです.typeがbuttonの場合、弾窓をクリックする必要がある場合はどうすればいいですか.私たちはwidgetsを書き直すことができます.TextInputメソッド
class PointInput(widgets.TextInput):
    class Media:
        js = (
            'admin/js/customform.js',
        )
        css = {'all':'[csspath]'}

メディア内部クラスのjsオブジェクトとcssオブジェクトに対応する静的ファイルを追加すればよい.ポップアップウィンドウの値取得はformにhiddenフィールドを追加することができ、valueは私たちが取得したい値にjsで値を割り当てることができます.