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

Django form wizard - variable number of forms

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

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 must be a class。显然,我没有将 slug 传递到正确的位置,但我不确定应该将它传递到哪里。我的猜测是我应该覆盖某些 SessionWizardView 方法,但到目前为止我没有任何运气(技能?)。

经过更多的研究,我终于做到了我想做的。提议的解决方案 here 成功了,尽管我不确定为什么会这样。

所以,这是我修改后的代码。 Class 来自引用答案的生成器:

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 = '/'

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