Django的ModelForm一直不更新数据,服务重启才会更新数据的BUG

问题

django的这个form,是从数据库获取数据的,但是数据库更新了之后,页面表单数据却没有更新,重启服务才会更新,怎么回事:

class OrderQueryForm(forms.Form):
    orders = OrderData.objects.values("name").distinct()
    choices = [(x["name"], x["name"]) for x in orders]
    product_name = forms.ChoiceField(label="产品名称", choices=choices)

解答

问题的原因是你的 OrderQueryForm 中的 choices 在类加载时初始化,并且它们只在加载时从数据库中获取一次。因此,即使数据库的数据发生了变化,除非重启服务,表单的 choices 不会更新。

要解决这个问题,可以在表单实例化时动态加载 choices,而不是在类加载时加载。你可以通过重写 __init__ 方法来实现。

下面是改进后的代码示例:

class OrderQueryForm(forms.Form):
    product_name = forms.ChoiceField(label="产品名称", choices=[])

    def __init__(self, *args, **kwargs):
        super(OrderQueryForm, self).__init__(*args, **kwargs)
        orders = OrderData.objects.values("name").distinct()
        choices = [(x["name"], x["name"]) for x in orders]
        self.fields['product_name'].choices = choices

在这个实现中,choices 是在表单实例化时获取的,因此每次页面加载时,都会从数据库中获取最新的数据,而不需要重启服务。

Leave a Comment