【问题标题】:Django serving stale form validation choicesDjango 提供陈旧的表单验证选项
【发布时间】:2016-05-10 15:46:43
【问题描述】:

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

为了验证,我在 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__ 方法?

【问题讨论】:

    标签: python django forms validation caching


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2016-10-11
      • 2016-03-22
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2020-06-28
      • 2020-05-07
      相关资源
      最近更新 更多