Django提供过时的表单验证选择

时间:2016-05-10 15:46:44

标签: python django forms validation caching

我有一系列视图,它们构建一组关联,然后根据该关联触发操作。

为了验证,我在forms.py中构建了一个自定义函数,并使用它来填充初始选择/验证值。

def targets():
    o = []
    for r in Target.objects.all():
        o.append((r.pk, r.host.statline()))
    return o

class StageForm(forms.Form):
    targets = forms.MultipleChoiceField(choices=targets(), widget=forms.CheckboxSelectMultiple())

在视图中,我计算一个与构建对象相关的新列表,检查以确保已定义所有必需参数,并将其作为所呈现的选项提交。

hl = Target.objects.filter(build=b)
   cl = []
   for h in hl:
       if h.host.ready():
          cl.append((h.pk, h.host.statline()))
       form.fields['targets'].choices = cl

我看到的问题是,如果我向环境添加一个新主机,表单将按照我的预期运行并呈现准备构建的主机,但随后显示的选项将无法通过验证。

我从构建生成的列表和我为验证生成的列表来自同一个地方,新主机明显在表中,但在重新启动开发服务器之前它不会出现在验证中。

为了增加陌生感,我从manage.py shell获得预期结果,而表单仍在使用陈旧数据进行验证。

这只是因为我在开发服务器上运行,或者我的方法在这里是站不住脚的,应该切换到覆盖__init__方法吗?

1 个答案:

答案 0 :(得分:1)

您应该将ModelMultipleChoiceField与查询集一起使用。

class StageForm(forms.Form):
    targets = forms.ModelMultipleChoiceField(queryset=Target.objects.all(), widget=forms.CheckboxSelectMultiple())

(如果目标字符串表示没有输出正确的显示值,您可以对该字段进行子类化并定义label_from_formset,如the docs所示。