3

ModelForm でフィールドをフィルタリングしようとしています。ビューのジェネリック CreateView をサブクラス化しています。Web で私の問題に関する多くの参照を見つけましたが、解決策は (少なくとも私にとっては) Django 1.3 のクラスベースのビューでは機能しないようです。

ここに私のモデルがあります:

#models.py

class Subscriber(models.Model):

    user = models.ForeignKey(User)
    subscriber_list = models.ManyToManyField('SubscriberList')
    ....

class SubscriberList(models.Model):

    user = models.ForeignKey(User)
    name = models.CharField(max_length=70)
....

これが私の見解です:

#views.py

class SubscriberCreateView(AuthCreateView):
    model = Subscriber
    template_name = "forms/app.html"
    form_class = SubscriberForm
    success_url = "/app/subscribers/"

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        return super(SubscriberCreateView, self).form_valid(form) 

フィルターなしで、サブスクライバーを追加するための元のフォームを次に示します。

#forms.py

class SubscriberForm(ModelForm):

    class Meta:
        model = Subscriber
        exclude = ('user', 'facebook_id', 'twitter_id')

これが私の変更されたフォームで、フィルタリングしようとしていますが、機能しません:

#forms.py

class SubscriberForm(ModelForm):

    class Meta:
        model = Subscriber
        exclude = ('user', 'facebook_id', 'twitter_id')

    def __init__(self, user, **kwargs):
        super(SubscriberForm, self).__init__(**kwargs)
        self.fields['subscriber_list'].queryset = SubscriberList.objects.filter(user=user)

この変更されたフォームを次のように変更すると:

def __init__(self, user=None, **kwargs)

それは機能します - それは私に加入者リストをもたらしません。しかし、リクエストユーザーを渡そうとすると、常に名前「リクエスト」または名前「自己」が定義されていないというエラーが発生します。

では、コードを変更して、request.user で subscriber_list をフィルタリングし、Django 1.3 の CreateView を引き続き使用するにはどうすればよいでしょうか。

4

1 に答える 1

17

この質問をさまざまな場所に投稿しているのがわかります..そして、私が見つけた方法は、同じことを理解しようとしていたからです。私はそれを機能させたと思います。これが私がしたことです。FormMixin の get_form() を上書きして、特定のフォーム フィールド クエリセットをフィルタリングしました。

class MyCreateView(CreateView):

    def get_form(self, form_class):
        form = super(MyCreateView,self).get_form(form_class) #instantiate using parent
        form.fields['my_list'].queryset = MyObject.objects.filter(user=self.request.user)
        return form
于 2011-08-28T23:18:56.327 に答える