从Django中基于类的通用视图将request.user对象发送到ModelForm

|| 因此,我的目标是能够在ModelForm中过滤ModelChoiceField查询集,使其仅包括request.user创建的Places。 我的ModelForm很简单:
class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event
我希望能够添加以下内容:
def __init__(self, *args, **kwargs):
    super(PlaceEventForm, self).__init__(*args, **kwargs)
    self.fields[\'place\'].queryset = Place.objects.filter(created_by=request.user)
但是,我似乎找不到在ModelForm中访问请求的方法。 我的看法是这样的:
class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = \'events/event_create.html\'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)
我不确定这是否接近我应该做的事,但是我尝试了:
def get_form_kwargs(self):
    kwargs = super(PlaceEventFormView, self).get_form_kwargs()
    kwargs.update({\'place_user\': self.request.user})
    return kwargs
但是我得到了错误:init()得到了意外的关键字参数\'place_user \' 关于这个有什么想法吗?还是有人可以想到一种无需将我的请求传递给ModelForm即可在视图中过滤我的ModelChoiceField的方法?     
已邀请:
您需要以
PlaceEventForm.__init__()
方法从
kwargs
中弹出键
user
,以防止其进入
ModelForm.__init__()
方法: views.py:
class PlaceEventFormView(CreateView):
    form_class = PlaceEventForm
    template_name = \'events/event_create.html\'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceEventFormView, self).dispatch(*args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super(PlaceEventFormView, self).get_form_kwargs()
        kwargs.update({\'place_user\': self.request.user})
        return kwargs
forms.py:
class PlaceEventForm(models.ModelForm):
    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        user = kwargs.pop(\'place_user\')
        # now kwargs doesn\'t contain \'place_user\', so we can safely pass it to the base class method
        super(PlaceEventForm, self).__init__(*args, **kwargs)
        self.fields[\'place\'].queryset = Place.objects.filter(created_by=user)
    
我正在使用iPhone,但是请执行以下操作:
def get_form(self, form_class):
     form = super(MyView, self).get_form(form_class)
     form.fields[\'place\'].querset = Place....
     return form
哇,好辛苦!没有缩进支持!     
要更新Yuji针对Django 1.10+(包括Django 2.0+)的答案,请参见下面的示例(注意更新的方法签名)。 Yuji的建议方法将查询集与其他业务逻辑一起保留在视图中,并有助于保持扩展
models.ModelForm
的任何表单类的简洁明了。
def get_form(self, form_class=None):
    if form_class is None:
        form_class = self.get_form_class()
    form = super(MyView, self).get_form()
    form.fields[\'place\'].queryset = Place.objects.filter(created_by=self.request.user)
    return form
更短:
def get_form(self, form_class=None):
    form = super(MyView, self).get_form(form_class)
    form.fields[\'place\'].queryset = Place.objects.filter(created_by=self.request.user)
    return form
    

要回复问题请先登录注册