我尝试创建一个包含可变数量问卷的表单向导,具体取决于它们中有多少个存在于数据库中并标记为活动状态。对于他们中的每一个我都使用这个表格和相同的模板。这是我的表格:
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方法,但到目前为止我没有运气(技能?)。
答案 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 = '/'
由于我不是专业人士(更像是一个推进的菜鸟),如果有人可以澄清这里发生的事情,那对未来的读者来说就是好的。