1. ホーム
  2. python

[解決済み] Django はどのようにしてフォームフィールドのレンダリング順序を知るのでしょうか?

2022-12-11 20:30:56

質問

以下のような Django フォームがあるとします。

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()

そして、このフォームのインスタンスの as_table() メソッドを呼び出すと、 Django は上で指定したのと同じ順序でフィールドをレンダリングします。

私の疑問は、クラス変数が定義された順番を Django がどうやって知ることができるのか、ということです。

(また、この順序をどのように上書きすればよいのでしょうか。例えば、クラスの init メソッドからフィールドを追加したい場合などには、どのようにこの順序を上書きするのでしょうか?)

どのように解決するのですか?

私は先に進み、自分の質問に答えました。 以下は今後の参考のための回答です。

Djangoでは form.py は暗黒の魔法を使って __new__ メソッドを使って、最終的にクラス変数を self.fields にロードします。 self.fields は、Django の SortedDict のインスタンスです (定義されているのは datastructures.py ).

これを上書きするために、例えば私の例では送信者を先にしたいが、送信者を init メソッドで追加する必要がある場合、次のようにします。

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)
        #first argument, index is the position of the field you want it to come before
        self.fields.insert(0,'sender',forms.EmailField(initial=str(time.time())))