django - 在测试环境中,Django 模型对象不会加载到 Form 中
问题描述
使用 Django 2.1.3
这里出现一个奇怪的错误;我有一个表单多项选择字段,它从数据库中模型中存在的值中提取其选择。
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,但这显然不适合测试环境。
有人遇到过这个吗?是否有一个聪明的技巧,它不涉及每次你想测试时在表单中注释掉行?
解决方案
我认为你的假设是正确的。类级别属性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]
推荐阅读
- .net - InstanceContextMode.Single 是否可用于 WCF basicHttpBinding?
- zebra-printers - 尝试使用 SGD 代码更改 Zebra 打印机上的 IP 配置
- pycharm - Pycharm 默认不折叠自定义代码区域
- amazon-web-services - 如何通过代码启用 AWS Elastic Beanstalk 运行状况规则“忽略负载均衡器 4xx”?
- google-api - 如何长时间访问(离线)Google API?
- arrays - 如何在数组中插入公式?
- c - 简单的 Windows 程序在 Linux 终端中运行,但不在 Windows cmd 中
- python - 如何在构建 Json 字符串时清除数组并重置 for 循环中的值?
- go - 如何使用 client-go 访问 kubernetes CRD?
- java - 如何在java中打印多个int