Подтвердить что ты не робот

Отправка объекта request.user в ModelForm из общего представления класса в Django

Итак, моя цель состоит в том, чтобы иметь возможность фильтровать набор запросов ModelChoiceField в моей модели ModelForm, чтобы включить только те места, которые создал request.user.

My 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'

Любые идеи по этому поводу? Или может кто-нибудь подумать о способе фильтрации моего ModelChoiceField в представлении без необходимости передавать мой запрос в ModelForm?

4b9b3361

Ответ 1

Вам нужно поместить ключ user из kwargs в метод PlaceEventForm.__init__(), чтобы он не перешел к методу 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)

Ответ 2

Я на iPhone, но сделаю следующее:

def get_form(self, form_class):
     form = super(MyView, self).get_form(form_class)
     form.fields['place'].querset = Place....
     return form

Ничего себе, это было сложно! Нет поддержки отступлений!