2009-07-28 4 views
0

私はこのような形を持っています値は選択フィールドに入力し、クエリーセットは現在ログインしているユーザーによってフィルタリングされる必要があります。ユーザーは

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.myfield = forms.ChoiceField([('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)]) 

が、私は、フォームをレンダリングした後に取得するすべての文字列などのオブジェクト参照の代わりに、セレクトウィジェットです:だから、それはリクエストオブジェクトを含むように私は、メソッドのシグネチャを変更しました。一度宣言されたフォームフィールドは変更できないようです。

アイデア?

答えて

2

はこれでコードの最後の行を置き換えます

self.fields['myfield'].choices = [('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)] 
0

私はここにあなたが後にしているものだと思う:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['myfield'] = forms.ModelChoiceField(MyModel.objects.filter(owners=user)) 

あなたMyModelリターンself.name__unicode__方法と仮定だと。 ではない場合は、ModelChoiceFieldのサブクラス化を行い、label_from_instanceメソッドをオーバーライドすることができます。