【问题标题】:Django - form's ChoiceField not updating immediatelyDjango - 表单的 ChoiceField 没有立即更新
【发布时间】:2019-01-11 08:57:40
【问题描述】:

我在forms.py 中创建了一个表单,它使用基于数据库对象的选择输入:

from controls.models import Valve

class CronjobForm(forms.Form):
    query = Valve.objects.all()
    VALVE_CHOICES = [
        (valve.pk, valve.name) for valve in query
    ]
    valves = forms.ChoiceField(required=True, widget=forms.Select, choices=VALVE_CHOICES)

起初,一切似乎都正常,HTML 的 <select>option 被渲染。

问题是,当我使用 Django 管理界面向数据库添加一个新的 Valve 对象时,ChoiceField 字段需要一段时间才能更新 - 我看不到前面的新选项- 立即结束。我尝试重新加载页面,强制重新加载,甚至将查询打印到终端 - 变量 query 立即更新,只是 HTML 没有。

它最终会在一段时间、一分钟左右后更新,这可能要归功于系统检查或重复 runserver 命令。

所以我想知道,我错过了什么?有没有办法强制更新表格?表单是否被缓存,这就是导致问题的原因?

【问题讨论】:

    标签: django python-3.x forms


    【解决方案1】:

    这是因为查询是在定义类时评估的,而不是在实例化表单时。

    不要这样做。使用ModelChoiceField,它接受一个查询集。

    class CronjobForm(forms.Form):
        valves = forms.ModelChoiceField(required=True, widget=forms.Select, queryset=Valve.objects.all())
    

    【讨论】:

      【解决方案2】:

      我们还可以传递函数的引用,该函数将返回数组以供选择,如the choices' description of django docs 中所述。

      我也遇到了同样的问题,就是这样解决的。

      def get_valve_choices():
          return [
              (valve.pk, valve.name) for valve in Valve.objects.all()
          ]
      
      class CronjobForm(forms.Form):
          valves = forms.ChoiceField(required=True, widget=forms.Select, choices=get_valve_choices)
      

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-11
        相关资源
        最近更新 更多