问题
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
是在表单实例化时获取的,因此每次页面加载时,都会从数据库中获取最新的数据,而不需要重启服务。