0

我有以下表格:

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 中。如何避免服务器重启?

4

2 回答 2

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_byvalues达到相同的效果。

于 2013-03-06T14:55:32.427 回答
0

在我的搜索中,我发现了一个更简单的解决方案: ModelMultipleChoiceField。它是这样实现的:

class AlertForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea())
    recipients = forms.ModelMultipleChoiceField(queryset=User.objects.all())

此表单字段处理所有详细信息,包括动态更新收件人字段。

于 2013-03-06T19:41:43.493 回答