依赖于其他模型的表单字段需要重新启动服务器

时间:2013-03-06 14:43:19

标签: django django-forms

我有以下表格:

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之前重新启动服务器。如何避免服务器重启?

2 个答案:

答案 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_byvalues将其压缩到查询集中,以达到同样的效果。

答案 1 :(得分:0)

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

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

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