tho*_*mad 4 python django django-forms
我正在创建一个使用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,)
Run Code Online (Sandbox Code Playgroud)
虽然mherren是正确的,您可以通过在__init__方法中定义您的选择来解决此问题,但有一种更简单的方法:使用ModelMultipleChoiceField专门设计用于获取查询集并动态更新的方法.
class EditUserProfileForm(forms.Form):
notifications = forms. ModelMultipleChoiceField(
label="Email Notifications",
required=False,
queryset = NoticeType.objects.all(),
widget=forms.CheckboxSelectMultiple)
Run Code Online (Sandbox Code Playgroud)
小智 6
我的预感是类定义只在加载时处理一次而不是每次实例化.尝试将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
Run Code Online (Sandbox Code Playgroud)