Django表单向导 - 可变数量的表单

时间:2015-03-29 15:03:30

标签: django forms django-formwizard

我尝试创建一个包含可变数量问卷的表单向导,具体取决于它们中有多少个存在于数据库中并标记为活动状态。对于他们中的每一个我都使用这个表格和相同的模板。这是我的表格:

class QuestionnaireForm(forms.Form):

    def __init__(self, slug='', *args, **kwargs):
        super(QuestionnaireForm, self).__init__(*args, **kwargs)

        degrees = Questionnaire.objects.get(slug=slug).degrees

        VALUES = ()
        for i in range(1,degrees+1):
            VALUES += ((i,i),)

        items = Item.objects.filter(Q(scales__questionnaire__slug=slug)|Q(scales__slug=slug)).order_by('ord_number')
        for item in items:
            self.fields[unicode(item.id)] = forms.ChoiceField(
                choices=VALUES,
                required=True, 
                widget=RadioSelect,
                error_messages={'required': 'Bro, you have to answer that.'},
                label = item.name)

现在,因为我需要提供一个slug到这个表格,以便每次都得到不同的问卷,我尝试过这样的事情:

class Testing(SessionWizardView):
    form_list = [QuestionnaireForm(slug=questionnaire.slug) for questionnaire in Questionnaire.objects.filter(active=True)]
    template_name = 'index.html'
    success_url = '/'

它给出了以下错误: issubclass()arg 1必须是类。显然,我没有在适当的地方传球,但我不确定我应该在哪里传球。我的猜测是我应该重写一些SessionWizardView方法,但到目前为止我没有运气(技能?)。

1 个答案:

答案 0 :(得分:0)

在做了一些研究后,我终于设法做了我想做的事。建议的解决方案here可以解决问题,即使我不确定为什么会这样做。

所以,这是我修改过的代码。引用答案的类生成器:

def class_generator(cls, **additionalkwargs):
    class ClassWithKwargs(cls):
        def __init__(self, *args, **kwargs):
            kwargs.update(additionalkwargs)
            super(ClassWithKwargs, self).__init__(*args, **kwargs)
    return ClassWithKwargs

然后我按照这样申请:

class Testing(SessionWizardView):
    form_list = [class_generator(QuestionnaireForm(slug=questionnaire.slug)) for questionnaire in Questionnaire.objects.filter(active=True)]
    template_name = 'index.html'
    success_url = '/'

由于我不是专业人士(更像是一个推进的菜鸟),如果有人可以澄清这里发生的事情,那对未来的读者来说就是好的。