Django模型对象无法在测试环境中的Form中加载

时间:2019-01-01 17:22:50

标签: django testing

使用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中注释掉行?

1 个答案:

答案 0 :(得分:1)

您的假设我认为是正确的。在测试实际开始运行之前,Python首次加载P_CHOICES类时会创建类级别属性ChartForm。稍后,这些夹具将作为测试setUpClass()的一部分(由测试框架调用)进行安装,但是到那时,P_CHOICES已经定义并且为空。

您可以尝试创建没有MultipleChoiceFieldchoices属性的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]