Django:模型更新时表单值不更新

6 投票
2 回答
2917 浏览
提问于 2025-04-15 14:42

我正在创建一个表单,里面有一个叫做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

撰写回答