2011-08-31 101 views
3

我想将参数传递给我的ModelForm的干净方法,以便我可以对某些数据执行一些额外的验证。将参数传递给Django ModelForm清理方法

在我的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 

我不断收到一个KeyError异常的foo。我不确定我在这里犯了什么错误,因为我以前通过了kwarg变量,但从来没有通过一个干净的方法。

回答

9

关键在于通过的ModelForm的init方法传递PARAMATERS:

def __init__(self, *args, **kwargs): 
    self.url = kwargs.pop('url', None) 
    super(FlatPageForm, self).__init__(*args, **kwargs) 

这个变量然后可以在干净的方法通过调用self.url

def clean_url(self): 
    url = self.cleaned_data['url'] 
    if self.url == url: 
     #do something 
    else: 
     #do something else 
0

当使用基于类引用视图,您可以使用get_form_kwargs将视图中的变量传递给您的表单,然后传给您清理方法:

在您的视图中:

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) 

,然后在clean()方法引用self.url