使用 Django 2.1.3
这里出现一个奇怪的错误;我有一个表单 multiplechoicefield,它从数据库中模型中存在的值中提取选择。
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 应用程序中添加了固定装置。
然而,它仍然会抛出错误。据推测,表单是在 编译测试数据库之前呈现的......?
所以我现在正在编辑表单,以便手动完成 P_CHOICES,但这显然不适合测试环境。
有人遇到过这个吗?是否有一个聪明的 hack 不涉及在每次要测试时注释掉表单中的行?
最佳答案
我认为你的推测是正确的。类级别属性P_CHOICES
在 Python 首次加载 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]
关于Django 模型对象不会在测试环境中以 Form 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997462/