2013-12-09 68 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