将参数传递给Django ModelForm清理方法

时间:2011-08-31 17:04:51

标签: django modelform

我试图将一个参数传递给我的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变量,但从来没有采用过干净的方法。

2 个答案:

答案 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()