2

カスタム フォーム フィールド (および場合によってはウィジェットも) を作成したいのですが、フォーム インスタンスがリクエスト間でどのように共有されるかわかりません。たとえば、モデル インスタンスからのデータを使用してフォームをレンダリングする場合、データを検証しているときにそのインスタンスを引き続き使用できますか? もしそうなら、それはリクエストの間にモデルを再度検索するための別のデータベース ヒットがあるということですか?

同様に、__init__メソッドで表示するデータのリストを受け取るカスタム フィールドを作成した場合、そのデータのリストは、ユーザーがデータを POST したときに検証するために使用できますか?

これが発生するdjangoソースの部分を誰かが教えてくれると本当に助かります。models.pyforms.pyfields.pyおよびwidgets.pyからを見てきましたがdjango.forms、すべてがどのように機能するかはまだ 100% わかりません。

最終的に、私がやりたいことは、次のように機能するフィールドを持つことです (重要な部分は最後の行です)。

class CustomField(ChoiceField):
    def __init__(self, data_dict, **kwargs):
        super(CustomField, self).__init__(**kwargs)
        self.data_dict = data_dict
        self.choices = data_dict.keys()
    def validate(self, value):
        if value not in self.data_dict:
            raise ValidationError("Invalid choice")
        else:
            return self.data_dict[value]

その data_dict は次のリクエストで利用できますか? カスタムを作成forms.Formして data_dict で初期化すると、次のリクエストで利用できるようになりますか? (たとえば、ファクトリメソッドなどで...)。

補足: これを行っているのは、(最終的には) Bootstrap の先行入力のようなものを使用したいためあり、サーバー側で変換する「きれいな値」を渡したいからです (基本的に、select のオプション値がどのようにできるかのように)送信された値が異なります)。過去にクライアント側の JavaScript でこれを行ったことがありますが、すべてをフォーム フィールドに統合するとよいでしょう。

4

1 に答える 1

2

フォームに魔法のようなものはありません。Django (またはほぼすべての Web フレームワーク) の他のすべてと同様に、オブジェクトは要求間で保持されず、毎回再インスタンス化する必要があります。これは、フォーム処理の通常のビュー パターンで発生します。POST の場合は 1 回インスタンス化し、GET の場合は別の時間にインスタンス化します。フォームに関連付けられたデータがある場合は、毎回渡す必要があります。

于 2012-08-30T08:22:49.963 に答える