カスタム フォーム フィールド (および場合によってはウィジェットも) を作成したいのですが、フォーム インスタンスがリクエスト間でどのように共有されるかわかりません。たとえば、モデル インスタンスからのデータを使用してフォームをレンダリングする場合、データを検証しているときにそのインスタンスを引き続き使用できますか? もしそうなら、それはリクエストの間にモデルを再度検索するための別のデータベース ヒットがあるということですか?
同様に、__init__
メソッドで表示するデータのリストを受け取るカスタム フィールドを作成した場合、そのデータのリストは、ユーザーがデータを POST したときに検証するために使用できますか?
これが発生するdjangoソースの部分を誰かが教えてくれると本当に助かります。models.py
、forms.py
、fields.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 でこれを行ったことがありますが、すべてをフォーム フィールドに統合するとよいでしょう。