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

Python Django:模型更新时表单值不更新,python,django,django-forms,Python,Django,Django Forms,我正在创建一个使用multipleechoicefield的表单。此字段的值来自另一个模型。这个方法工作得很好,但是,我注意到(在生产服务器上)当我向有问题的模型(NoticeType)添加一个新项时,表单不会动态更新。我必须重新启动服务器,新项目才能显示在我的MultipleChiiceField上 对NoticeType模型的任何更改(编辑项或创建新项)都不会传播到表单中。重新启动生产服务器后,将显示更新 你知道为什么会这样吗?表格的相关部分如下所示。谢谢 from django impor

我正在创建一个使用multipleechoicefield的表单。此字段的值来自另一个模型。这个方法工作得很好,但是,我注意到(在生产服务器上)当我向有问题的模型(NoticeType)添加一个新项时,表单不会动态更新。我必须重新启动服务器,新项目才能显示在我的MultipleChiiceField上

对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,)

我的直觉是类定义只在加载时处理一次,而不是每次实例化。尝试将选项计算添加到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

虽然mherren认为可以通过在
\uuuu init\uuuu
方法中定义您的选择来解决此问题是正确的,但有一种更简单的方法:使用
modelmultipechoicefield
,该方法专门用于进行查询集,并动态更新

class EditUserProfileForm(forms.Form):
    notifications = forms. ModelMultipleChoiceField(
                    label="Email Notifications",
                    required=False,
                    queryset = NoticeType.objects.all(),
                    widget=forms.CheckboxSelectMultiple)

嘿太好了,马上就修好了。实际上,在我发布之后,我有一个类似的想法,但没有考虑
\uuu init\uuu()
方法。。。我想我可以在返回列表的类之外创建一个新函数。。。但我更喜欢这个。非常感谢。那更性感!我觉得再好不过了——谢谢你。将进行调整,在我的代码库中节省一些宝贵的空间。谢谢。使用这种技术,我仍然能够指定哪个模型字段在表单上显示为“文本”吗?默认情况下,它使用
\uuuuuuuunicode\uuuu
表示。如果您需要一些不同的东西,那么您需要将modelmultipechoicefield子类化,并覆盖
label\u from\u instance
,如下所述:谢谢-我想我可能会这样做,因为我认为这似乎是“django”想要的方式。我是stackoverflow的新手-我是否应该在完成后将我最后的“工作”代码作为“答案”发布?@DanielRoseman感谢您
label\u from\u instance
!帮助很大。