在Django表单中存储动态字段

hek*_*ran 6 django django-forms

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

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

Lud*_*mer 7

看看Django最初的创始人之一Jacob Kaplan-Moss最近发表的这篇文章:"动态表格生成".它使用一个示例逐步向您显示该过程.好读.

Django的发布经理James Bennett还发表了一篇2008年的文章.


knu*_*tin 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
Run Code Online (Sandbox Code Playgroud)

并像这样使用它: form = MyForm(user = user, stuff = stuff)


Lak*_*sad 5

在python中,您可以动态地实例化一个类.knutin展示了动态自定义表单并添加几个字段的好例子.

您也可以动态创建整个表单,如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 })
Run Code Online (Sandbox Code Playgroud)