#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