Django:在 forms.py clean 函数中访问请求
Posted
技术标签:
【中文标题】Django:在 forms.py clean 函数中访问请求【英文标题】:Django: Accessing request in forms.py clean function 【发布时间】:2012-08-17 08:06:48 【问题描述】:你好 *** 的人,
在 forms.py 中的 clean 函数中,我想在会话变量中自动保存一些信息。但是,我似乎无法访问请求变量。
所有移交请求变量的示例都是基于基于函数的视图,但这里我使用的是基于类的视图。
我的 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
我的意见.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 的最佳方式是什么?
感谢您的回答。
【问题讨论】:
您可以将它传递给 init,将其分配给 self.request,然后从 clean 中访问它。 我曾尝试将form_class = CreateItemForm
替换为form_class = CreateItemForm(request)
,但这会导致更多问题。还是您的意思是不同的解决方案?
我在this *** link.中解释了一种更简单的解决方案
我已经发布了一个更简单的解决方案in this *** link.
【参考方案1】:
覆盖 form.get_initial() 对我有用
class ItemCreate(FormView):
def get_initial(self):
init = super(ItemCreate, self).get_initial()
init.update('request':self.request)
return init
在 clean 中我们可以使用 form.initial dict 访问它
class sampleForm(forms.Form):
...
...
def clean(self):
user_request = self.initial['request']
顺便说一句,我们不需要像上面建议的那样弹出额外的参数。
【讨论】:
【参考方案2】:您可以覆盖FormMixin
的get_form_kwargs
method 以将请求添加到表单的初始化参数中:
class ItemCreate(FormView):
def get_form_kwargs(self):
kwargs = super(ItemCreate, self).get_form_kwargs()
kwargs.update(
'request' : self.request
)
return kwargs
【讨论】:
我已将该方法添加到基于类的视图中,但随后表单的__init__() method
抛出以下错误__init__() got an unexpected keyword argument 'request'
。你知道为什么吗?
request
应该是关键字 arg:def __init__(self, request=None, *args, **kwargs):
应该和UpdateView一样吗?我尝试添加您修改后的get_form_kwargs
,但我得到了name 'request' is not defined
。以上是关于Django:在 forms.py clean 函数中访问请求的主要内容,如果未能解决你的问题,请参考以下文章