Передача пользователя, запроса к формам

#django #django-forms

#django #django-forms

Вопрос:

Как бы мне передать пользовательский объект или запрос в мою форму для проверки?

Например, я хочу иметь возможность делать что-то вроде этого —

 class Form(forms.Form):
    ...
    def clean(self)
        user = request.user   # how to get request.user here?
        user = User           # how to pass the actual User object?
  

Спасибо.

Ответ №1:

Просто передайте его в конструктор и сохраните как переменную экземпляра:

 class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(MyForm, self).__init__(*args, **kwargs)

    def clean(self):
        print self.request.user
        ...
  

На ваш взгляд:

 form = MyForm(..., request=request)
  

И если используется представление на основе класса (CreateView в этом примере):

 class MyCreateView(CreateView):

    ... 

    def get_form_kwargs(self):
        kwargs = super(MyCreateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs
  

Комментарии:

1. странно, но это не работает: ошибка имени: имя ‘request’ не определено

2. Это все еще работает в django 2? Я следил за всем, но kwargs не обновляются в форме..

3. ДА. Это работает в Django 2.0.2 Возможно, вам нужно перейти **kwargs к методу def get_form_kwargs(self, **kwargs): kwargs = super(MyCreateView, self).get_form_kwargs() И не делать этого self.request перед вызовом super. Просто пользователь, request = kwargs.pop("request") возможно, вы могли бы быть пользователем self.request после вызова super.

4. У меня также возникают проблемы с этим в версии 2.0