Django: Доступ к запросу в чистой форме forms.py
Привет люди Stackru,
В моей чистой функции в forms.py я хотел бы автоматически сохранять некоторую информацию в переменной сеанса. Тем не менее, я, кажется, не получить доступ к переменной запроса.
Все примеры для передачи переменной запроса основаны на представлениях на основе функций, но здесь я использую представление на основе классов.
Мои формы.
from django import forms
from item.models import Item
class CreateItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ('name', 'description')
def __init__(self, request, *args, **kwargs):
self.request = request
super(CreateItemForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(CreateItemForm, self).clean()
if cleaned_data.get("address"):
self.request.session['name'] = cleaned_data.get("name")
else:
raise forms.ValidationError(_('Oops, can\'t find location.'))
return self.cleaned_data
Мои views.py:
from django.views.generic.edit import FormView
from item.forms import CreateItemForm
class ItemCreate(FormView):
form_class = CreateItemForm
template_name = 'item/item_create.html'
success_url = 'http://www.google.com'
Каков наилучший способ передать request
переменная из views.py в forms.py?
Спасибо за ваш ответ.
2 ответа
Вы можете переписать FormMixin
"s get_form_kwargs
метод для добавления запроса в параметры инициализации формы:
class ItemCreate(FormView):
def get_form_kwargs(self):
kwargs = super(ItemCreate, self).get_form_kwargs()
kwargs.update({
'request' : self.request
})
return kwargs
Переопределение form.get_initial() работает для меня
class ItemCreate(FormView):
def get_initial(self):
init = super(ItemCreate, self).get_initial()
init.update({'request':self.request})
return init
И в чистом виде мы можем получить к нему доступ с помощью form.initial dict
class sampleForm(forms.Form):
...
...
def clean(self):
user_request = self.initial['request']
Кстати, нам не нужно выдвигать лишние аргументы, как предложено выше.