我有以下表格:
class AlertForm(forms.Form):
user_choices = sorted([(c.id, c.first_name + ' ' + c.last_name) \
for c in User.objects.all()], key=lambda user: user[1])
message = forms.CharField(widget=forms.Textarea())
recipients = forms.MultipleChoiceField(choices=user_choices,
widget=forms.SelectMultiple(attrs={'size':'20'}),
help_text="You will automatically be included with the recipients.")
问题是如果我使用管理界面或任何其他方法将用户添加到数据库,我必须在新添加的用户出现在MultipleChoiceField之前重新启动服务器。如何避免服务器重启?
答案 0 :(得分:3)
如果您想动态计算choices
,则需要在表单的__init__
方法中而不是在表单定义中执行此操作。请记住,类的主体只在加载类定义时执行一次 - 这就是服务器重新启动修复问题的原因。
你会想要这样的东西:
def __init__(self, *args, **kwargs):
super(AlertForm, self).__init__(*args, **kwargs)
user_choices = sorted([(c.id, c.first_name + ' ' + c.last_name) \
for c in User.objects.all()], key=lambda user: user[1])
self.fields['recipients'].choices = user_choices
您也可以使用聚合order_by
和values
将其压缩到查询集中,以达到同样的效果。
答案 1 :(得分:0)
在我的搜索中,我找到了一个更简单的解决方案:ModelMultipleChoiceField。它是这样实现的:
class AlertForm(forms.Form):
message = forms.CharField(widget=forms.Textarea())
recipients = forms.ModelMultipleChoiceField(queryset=User.objects.all())
此表单字段处理所有详细信息,包括动态更新收件人字段。