Django:模型更新时表单值不更新
我正在创建一个表单,里面有一个叫做MultipleChoiceField的选项字段。这个字段的值是从另一个模型中获取的。这个方法本身是没问题的,但我发现,在生产服务器上,当我往相关模型(NoticeType)里添加新项目时,表单并不会自动更新。我必须重启服务器,新的项目才能在MultipleChoiceField中显示出来。
对NoticeType模型的任何更改(比如编辑项目或创建新项目)都不会反映到表单上。只有在我重启生产服务器后,更新才会出现。
你们觉得这可能是什么原因呢?下面是表单的相关部分。谢谢。
from django import forms
from django.contrib.auth.models import User
from notification.models import NoticeType
class EditUserProfileForm(forms.Form):
CHOICES = []
for notice in NoticeType.objects.all():
CHOICES.append( (notice.label,notice.display) )
notifications = forms.MultipleChoiceField(
label="Email Notifications",
required=False,
choices=( CHOICES ),
widget=forms.CheckboxSelectMultiple,)
2 个回答
9
虽然mherren说得对,你可以通过在__init__
方法中定义你的选择来解决这个问题,但其实还有更简单的方法:使用ModelMultipleChoiceField
,这个字段专门用来处理查询集,并且可以动态更新。
class EditUserProfileForm(forms.Form):
notifications = forms. ModelMultipleChoiceField(
label="Email Notifications",
required=False,
queryset = NoticeType.objects.all(),
widget=forms.CheckboxSelectMultiple)
7
我觉得这个类的定义在加载时只处理一次,而不是每次创建实例时都处理。你可以试着把 CHOICES 的计算放到 init 方法里,像这样:
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
CHOICES = []
for notice in NoticeType.objects.all():
CHOICES.append( (notice.label, notice.display) )
self.fields['notifications'].choices = CHOICES