代码之家  ›  专栏  ›  技术社区  ›  thornomad

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

  •  4
  • thornomad  · 技术社区  · 15 年前

    我正在创建一个使用多回音场的窗体。此字段的值是从另一个模型派生的。但是,这个方法工作得很好,我注意到(在生产服务器上)当我向相关模型(noticeType)添加新项时,表单不会动态更新。我必须重新启动服务器,新项目才能显示在我的multipleechoicefield上。

    对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 回复  |  直到 15 年前
        1
  •  6
  •   mherren    15 年前

    我的直觉是类定义只在加载时处理一次,而不是每次实例化。尝试将选项计算添加到 初始化 方法如下:

    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
    
        2
  •  8
  •   Daniel Roseman    15 年前

    虽然mherren是对的,您可以通过在 __init__ 方法,有一种更简单的方法:使用 ModelMultipleChoiceField 它专门设计用于获取查询集并动态更新。

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