在 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
内部类'Meta')
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)
奖金问题:
为什么 Bennett 创造了ContactForm
out offorms.BaseForm
而不是forms.Form
?(我假设这就是为什么也调用这些字段的原因base_fields
。)