Django模型对象不会在测试环境中以表单形式加载

Django模型对象不会在测试环境中以表单形式加载,django,testing,Django,Testing,使用Django 2.1.3 这里有一个奇怪的错误;我有一个表单multipleechoicefield,它从数据库中模型中存在的值中提取选择 class ChartForm(Form): P_CHOICES = tuple((p["p"], p["p"]) for p in VAR.objects.all().values("p")) p = MultipleChoiceField(widget=CheckboxSelectMultiple, choices=P_CHOICE

使用Django 2.1.3

这里有一个奇怪的错误;我有一个表单multipleechoicefield,它从数据库中模型中存在的值中提取选择

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应用程序中的fixture

然而,它仍然抛出了错误。大概,表单是在编译测试数据库之前呈现的

因此,我现在正在编辑表单,以便手动完成p_选择,但这显然不适合于测试环境


有人见过这个吗?有没有一种聪明的方法不需要每次你想测试的时候都注释掉表单中的行呢?

我认为你的假设是正确的。类级属性
P_CHOICES
是在Python在测试实际开始运行之前首次加载
ChartForm
类时创建的。夹具稍后作为测试的
setUpClass()
(由测试框架调用)的一部分安装,但此时
P\u选项已定义且为空

您可以尝试创建
MultipleChoiceField
,而不使用其
选项
initial
属性,然后在数据可用时在表单的
\uuuu init\uuu
中设置这些属性。例如:

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]

是否可以尝试打印
VAR.objects.all()
的输出,以确保在创建db.thx之前表单正在呈现。是的。你真的应该使用ModelChoiceField和queryset来处理这类事情。我不太明白。all()是一个查询集。我不相信任何查询集都不会正确加载。