James Bennett の記事「So you want a dynamic form」 (2008 年 11 月 9 日) で、彼は次のようにして動的フォームを作成できると書いています。
def make_contact_form(user):
fields = { 'name': forms.CharField(max_length=50),
'email': forms.EmailField(),
'message': forms.CharField(widget=forms.Textarea) }
if not user.is_authenticated():
fields['captcha'] = CaptchaField()
return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields })
しかし、どうやって同じことをしforms.ModelForm
ますか?
これまでのところ、私はこのようなことをしているだけです(type
内部クラス「メタ」での使用方法がわかりませんでした)
def make_order_edit_form(include_fields):
class _OrderEditForm(forms.ModelForm):
if 'fa_date' in include_fields:
fa_date = CustomDateTimeField(label="first appointment time")
class Meta:
model = Order
fields = include_fields
widgets = custom_widgets
return _OrderEditForm
include_fields
表示したいフィールドのタプルはどこにありますか。
しかし、正しいと書いたとしてもmake_order_edit_form
、どのように使用すればよいのviews.py
でしょうか? 具体的には、POST リクエストと注文インスタンスの両方を渡すにはどうすればよいですか? 通常、私は次のようなことをします
order = Order.objects.get(pk=pk)
order_form = OrderEditForm(data=request.POST, instance=order)
おまけの質問:
ベネットが の代わりにContactForm
アウト を作成したのはなぜですか? (それがフィールドも呼び出される理由だと思います。)forms.BaseForm
forms.Form
base_fields