Python Django提供陈旧表单验证选项

Python Django提供陈旧表单验证选项,python,django,forms,validation,caching,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.Multi

我有一系列视图,这些视图构建了一组关联,然后基于该关联触发了一个操作

为了验证,我在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
中获得了预期的结果,而表单仍在使用过时的数据进行验证


这仅仅是因为我在开发服务器上运行,还是因为我的方法论在这里是站不住脚的,应该切换到覆盖
\uuu init\uuu
方法?

您应该使用带有查询集的
modelmultipechoicefield

class StageForm(forms.Form):
    targets = forms.ModelMultipleChoiceField(queryset=Target.objects.all(), widget=forms.CheckboxSelectMultiple())
(如果目标字符串表示法未输出正确的显示值,则可以对字段进行子类化,并从_formset中定义
标签,如中所示