在Django表单中存储动态字段

时间:2010-03-24 08:04:48

标签: django django-forms

Django的表单库具有表单集功能,允许您处理动态添加的表单。例如,如果您的应用程序具有书签列表,您可以使用表单集来处理表单集,以处理多个表单,每个表单都代表一个书签。

如果要动态地向表单添加字段,该怎么办?一个示例是调查创建页面,您可以在其中动态添加无限数量的问题。你如何在Django中处理这个问题?

3 个答案:

答案 0 :(得分:7)

请看Django最初的创始人之一Jacob Kaplan-Moss最近发表的这篇文章:"Dynamic form generation"。它使用一个示例逐步向您显示该过程。好读。

还有a 2008 article by James Bennett,Django的发布经理。

答案 1 :(得分:5)

要添加,删除和更改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)

答案 2 :(得分:5)

在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 })