Django 1.3 CreateView,ModelForm和request.user过滤字段

3 django-forms django-views django-class-based-views django-1.3

我正在尝试过滤ModelForm上的字段.我为我的视图创建了通用CreateView的子类.我在网上发现了许多关于我的问题的引用,但是对于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)
....
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

#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) 
Run Code Online (Sandbox Code Playgroud)

这是我添加订阅者的原始表单,没有过滤器:

#forms.py

class SubscriberForm(ModelForm):

    class Meta:
        model = Subscriber
        exclude = ('user', 'facebook_id', 'twitter_id')
Run Code Online (Sandbox Code Playgroud)

这是我修改后的表单,尝试过滤,但不起作用:

#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)
Run Code Online (Sandbox Code Playgroud)

如果我更改此修改后的表单如下:

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

它有效 - 它没有给我带来订阅者列表.但无论如何我尝试传递请求用户,我总是得到一个名称"请求"或名称"自我"未定义错误.

那么,我如何修改我的代码以通过request.user过滤subscriber_list,并仍然使用Django 1.3的CreateView.

sha*_*all 14

我看到你一直在各个地方发布这个问题..而我发现的方式是因为我试图弄清楚同样的事情.我我刚刚开始工作了,这就是我的所作所为.我从FormMixin覆盖了get_form()来过滤特定的表单字段queryset:

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
Run Code Online (Sandbox Code Playgroud)