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_byおそらく、 集約を使用してクエリセットに凝縮してvalues、同じ効果を達成することもできます。

于 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 に答える