2009-09-30 84 views
4

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

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

回答

6

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

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 
+0

嘿!很好 - 立即修复它。在发布之后,我实际上有一个类似的想法,但并没有考虑'__init __()'方法......我想我可以在返回列表的类之外创建一个新函数......但我甚至喜欢这个更好。谢谢! – thornomad

8

虽然mherren是正确的,你可以通过定义__init__方法你选择解决这个问题,有一个简单的方法:用ModelMultipleChoiceField这专门设计用于接收查询集并动态更新。

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

这更性感!我认为它不会变得更好 - 谢谢你。将进行这种调整,以节省我的代码库中的一些宝贵空间。谢谢。 – thornomad

+1

使用这种技术,我仍然能够指定哪个模型字段显示为表单上的“文本”? – thornomad

+0

默认情况下,它使用'__unicode__'表示。如果你需要不同的东西,你需要继承ModelMultipleChoiceField并覆盖'label_from_instance',如下所述:http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield –