Sending request.user object to ModelForm from class based generic view in Django

后端 未结 3 1306
旧巷少年郎
旧巷少年郎 2020-12-05 08:06

So, my goal is to be able to filter a ModelChoiceField queryset in my ModelForm to only include Places that request.user has created.

My ModelForm is simply:

3条回答
  •  一向
    一向 (楼主)
    2020-12-05 08:51

    You need to pop key user from kwargs in PlaceEventForm.__init__() method, to prevent it from going to ModelForm.__init__() method:

    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)
    

提交回复
热议问题