2013-12-09 29 views
0

我已经完成了我的表单的第一个验证器,我有一种感觉,这不是它应该完成的方式。django表单验证看起来像不好的代码

它的工作原理,但它看起来像丑陋的代码,有人可以帮忙吗?

我的表格:

class CountryForm(forms.ModelForm): 
    """Form to create or edit Countries.""" 

    class Meta: 
     model = Country 

    def clean_name(self): 
     raw_data = self.cleaned_data['name'] 
     data = raw_data.title() 

     try: 
      Province.objects.get(name=data).exists() 
      raise forms.ValidationError("There is already a province with the name: %s") % data 
     except: 
      pass 
     try: 
      Region.objects.get(name=data).exists() 
      raise forms.ValidationError("There is already a region with the name: %s") % data 
     except: 
      pass 
    return data 

我的想法是,看看名字作为名称存在于其他两款车型,当它确实提出了一个错误。

回答

1

您在这里使用错误的Queryset方法。 get()返回一个模型对象,该模型对象并不具有exists()方法。您应该使用filter()

此外,exists()不会引发异常。所以,你可以做一个正常的if

if Province.objects.filter(name=data).exists(): 
    raise forms.ValidationError(...) 

请记住,以及该clean方法将被调用的更新,以及一个创造。在更新时,检查将失败,因为它会找到您正在编辑的实例。您应该绕过这个检查,如果窗体有一个实例,该实例有一个pk值:

if not (form.instance and form.instance.pk): 

最后,你应该永远使用except声明。这将捕获所有异常,可能会隐藏您的代码的一些实际问题。一定要记住你认为你的代码会提高的特定异常 - 在这种情况下,Province.DoesNotExist

+0

非常感谢,使得更清楚:) –

+0

然而,我有点不确定,如果没有放置的地方(form.instance和form.instance.pk):我认为之前他们检查与其他2缩进,但没有似乎在做伎俩 –

0

这是行不通的,因为您将永远处理clean_name函数中的异常,并且永远不会引发验证异常!

而是做到这一点

 

if Province.objects.filter(name=data).exists() or Region.objects.filter(name=date).exists(): 
    raise forms.ValidationError("...") 

除此之外,你的代码就好了!

+0

'Province.objects.get(name = data)'如果找不到记录或返回多个记录,则抛出异常。 – karthikr

+0

是的,你需要使用过滤器而不是get。 – Serafeim