Web サイトで Django フォームを使用しており、フィールドの順序を制御したいと考えています。
フォームを定義する方法は次のとおりです。
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
名前は不変であり、エンティティの作成時にのみリストする必要があります。継承を使用して、一貫性と DRY 原則を追加します。間違いではなく、実際には完全に予想されるのは、名前フィールドがview/htmlの最後にリストされていることですが、名前フィールドを概要と説明の上に配置したいと思います。要約と説明を create_form にコピーして継承を失うことで簡単に修正できることはわかっていますが、これが可能かどうか知りたいです。
なんで?edit_form に 100 個のフィールドがあり、create_form の一番上に 10 個のフィールドを追加する必要があると想像してください。2 つのフォームをコピーして維持するのはそれほど魅力的ではありません。(これは私の場合ではありません。例を作成しているだけです)
では、どうすればこの動作をオーバーライドできますか?
編集:
どうやら厄介なハック(.field属性をいじる)を経ずにこれを行う適切な方法はないようです。.field 属性は、キーと値のペアを並べ替える方法を提供しない SortedDict (Django の内部データ構造の 1 つ) です。ただし、特定のインデックスに項目を挿入する方法は提供されますが、それでは項目がクラス メンバーからコンストラクターに移動されます。この方法は機能しますが、コードが読みにくくなります。私が適切と考える他の唯一の方法は、ほとんどの状況で最適とは言えないフレームワーク自体を変更することです。
要するに、コードは次のようになります。
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
def __init__(self,*args,**kwargs):
forms.Form.__init__(self,*args,**kwargs)
self.fields.insert(0,'name',forms.CharField())
それは私を黙らせました:)