Django动态表单示例

afs*_*hin 10 django django-forms django-views

我有一个在Django中创建动态表单的简单要求 - 我已经看过很多例子,但它们似乎不完整,或者需要比我更广泛的Python和Django知识!没有显示应该如何调用示例的动态部分:

这是Q1和Q2的表单类 - 我在表单上放置一个按钮来添加另一个名为Q3的字段 - 然后再次按下Q4:我认为我的init函数半正确:

class testform(forms.Form):
    Q1 = forms.CharField()
    Q2 = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(testform,self).__init__(*args,**kwargs)
        self.fields['Q%s'%i] = forms.CharField(label='Q%i' % i)
Run Code Online (Sandbox Code Playgroud)

我想在表单上放置一个按钮以添加另一个名为Q3的字段,然后再次按下Q4.

  • 如何从视图中调用_ init _function来添加这些字段?
  • 如果我使用Javascript动态添加字段,我如何调用init以便在POST表单时能够正确验证Django?

Bry*_*law 9

回答你的问题:每当你初始化表单时,它都会调用init().例如:form = testform().这会初始化您的表单.我在这里要做的是添加一些javascript来创建这些新字段.我不确定你对javascript有多熟悉,但我会假设你可以自己解决这个问题.

至于验证,可以在表单中完成.首先,你要告诉它你已经添加了更多的字段init().

class TestCharField(forms.CharField):
    def __init__(self, *args, **kwargs):
        super(TestCharField, self).__init__(*args, **kwargs) # Needs * and **
    def clean(self, value):
        super(TestCharField, self).clean(value)
        # Do custom validation in here
        return value

class testform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(testform, self).__init__(args, kwargs)

        # args should be a list with the single QueryDict (GET or POST dict)
        # that you passed it
        for k,v in args[0].items():
            if k.startswith('Q') and k not in self.fields.keys():
                self.fields[k] = TestCharField(initial=v, required=True)
Run Code Online (Sandbox Code Playgroud)

你可以随意命名你的字段,它不一定是TestCharField.只需确保在两个地方重命名.这将允许您根据需要创建任意数量的字段.如果这对您不起作用,请告诉我.