【发布时间】:2011-01-31 03:48:21
【问题描述】:
Django 的表单库具有表单集的功能,允许您处理动态添加的表单。例如,如果您的应用程序有一个书签列表,您可以使用表单集,您可以使用表单集来处理多个表单,每个表单代表一个书签。
如果您想动态地向表单添加字段,该怎么办?一个示例是调查创建页面,您可以在其中动态添加无限数量的问题。你如何在 Django 中处理这个问题?
【问题讨论】:
标签: django django-forms
Django 的表单库具有表单集的功能,允许您处理动态添加的表单。例如,如果您的应用程序有一个书签列表,您可以使用表单集,您可以使用表单集来处理多个表单,每个表单代表一个书签。
如果您想动态地向表单添加字段,该怎么办?一个示例是调查创建页面,您可以在其中动态添加无限数量的问题。你如何在 Django 中处理这个问题?
【问题讨论】:
标签: django django-forms
要在 Form 或 ModelForm 上添加、删除和更改字段,只需像这样覆盖 __init__():
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
other_stuff = kwargs.pop('stuff')
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_dynamic_field'] = forms.Field(...)
# Add fields based on user or other_stuff
并像这样使用它:form = MyForm(user = user, stuff = stuff)
【讨论】:
看看最近由 Django 的创始人之一 Jacob Kaplan-Moss 撰写的帖子:"Dynamic form generation"。它使用一个示例逐步向您展示该过程。很好读。
还有a 2008 article by James Bennett,Django 的发布经理。
【讨论】:
在 python 中,您可以动态地实例化一个类。 knutin 展示了一个基于动态自定义表单并添加一些字段的好示例。
您也可以动态创建整个表单,取自example given by James Bennett:
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 })
【讨论】: