我试图将一个参数传递给我的ModelForm的clean方法,以便我可以对某些数据执行一些额外的验证。
在我的views.py文件中,我有:
page_data = page_form.cleaned_data(foo="bar")
在我的clean_url方法中,我有:
def clean_url(self, **kwargs):
url = self.cleaned_data['url']
if kwargs['foo'] == url:
query = FlatPage.objects.filter(url=url)
if query.exists():
raise forms.ValidationError(("This url is already being used by the '%s' page.") % (query[0].title))
return url
我一直在为foo
获取KeyError。我不知道我在这里犯了什么错误,因为我之前已经通过了kwarg变量,但从来没有采用过干净的方法。
答案 0 :(得分:9)
关键在于通过ModelForm init方法传递参数:
def __init__(self, *args, **kwargs):
self.url = kwargs.pop('url', None)
super(FlatPageForm, self).__init__(*args, **kwargs)
然后可以通过调用self.url
在clean方法中引用此变量def clean_url(self):
url = self.cleaned_data['url']
if self.url == url:
#do something
else:
#do something else
答案 1 :(得分:0)
使用基于类的视图时,可以使用get_form_kwargs
将视图中的变量传递给表单,然后使用clean方法:
在您看来:
def get_form_kwargs(self):
kwargs = super(MyCreateView, self).get_form_kwargs()
kwargs.update({'url': self.kwargs['url']}) # or wherever the url parameter is coming from
return kwargs
以您的形式:
def __init__(self, *args, **kwargs):
self.url = kwargs.pop('url', None)
super(FlatPageForm, self).__init__(*args, **kwargs)
然后在self.url
方法中引用clean()
。