使用Django 2.1.3
在这里得到一个奇怪的错误;我有一个表单multichoicefield,它从数据库模型中现有的值中得出选择。
class ChartForm(Form):
P_CHOICES = tuple((p["p"], p["p"]) for p in VAR.objects.all().values("p"))
p = MultipleChoiceField(widget=CheckboxSelectMultiple, choices=P_CHOICES, initial=P_CHOICES[0][1])
我正在尝试为项目中的不同应用运行测试。它将引发以下错误:
File "/code/pyyc/forms.py", line 31, in ChartForm
p = MultipleChoiceField(widget=CheckboxSelectMultiple, choices=P_CHOICES, initial=P_CHOICES[0][1])
IndexError: tuple index out of range
我认为这仅仅是因为没有加载模型对象。因此,我从VAR应用程序中添加了灯具。
但是,它仍然会引发错误。大概是在测试数据库被编译之前 呈现Form ...?
所以我现在正在编辑表单,以便手动完成P_CHOICES,但这显然不适合测试环境。
有人遇到过吗?是否有一个聪明的技巧,而不必在每次要测试时都在Form中注释掉行?
答案 0 :(得分:1)
您的假设我认为是正确的。在测试实际开始运行之前,Python首次加载P_CHOICES
类时会创建类级别属性ChartForm
。稍后,这些夹具将作为测试setUpClass()
的一部分(由测试框架调用)进行安装,但是到那时,P_CHOICES
已经定义并且为空。
您可以尝试创建没有MultipleChoiceField
和choices
属性的initial
,然后在数据可用时在表单的__init__
中进行设置。例如:
class ChartForm(Form):
p = MultipleChoiceField(widget=CheckboxSelectMultiple)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
p_choices = tuple((p["p"], p["p"]) for p in VAR.objects.all().values("p"))
# Now we have the data we can set the attributes
self.fields['p'].choices = p_choices
self.fields['p'].initial = p_choices[0][1]