2014-09-02 28 views
0

我有一個我的頁面的custum註冊表單,我試圖創建一個乾淨的方法,可以檢查用戶嘗試註冊時是否感到不適。如果他們感到不快,他們不應該看到任何警告。清理兩個表單字段在一起

我的模型:

class Profile(models.Model): 
    user = models.OneToOneField(User) 
    external_reference = models.CharField(max_length=500, blank=True) 

我的清潔方法:

def clean_email(self): 
    email = self.cleaned_data['email'] 
    external_reference = self.cleaned_data['external_reference'] 
    if User.objects.filter(email=email).exists(): 
     try: 
      #User exist, use form to update user 
      Profile.objects.get(external_reference=external_reference, user__email=email) 
      return email 
     except Profile.DoesNotExist:  
      raise forms.ValidationError(u'Email in use') 

    return email 

我得到這個錯誤:KeyError: 'external_reference'

也許只可能 「乾淨」 的一個字段的時候?有沒有另外一種方法呢?

+2

這樣的事情應該使用'clean()'形式的方法而不是字段來完成。 – Rohan 2014-09-02 11:57:22

回答

0

看一看Form and field validation的官方文檔清潔和驗證互相依賴的字段部分。

由於Rohan評論說你應該清理clean()方法中相互依賴的字段。

clean_email被稱爲external_reference尚未有清洗它不是self.cleaned_data尚未(因此KeyError異常)。

def clean(self): 
    cleaned_data = super(Class, self.clean) 
    email = cleaned_data.get('email') 
    external_reference = cleaned_data.get('external_reference') 
    if email and external_reference: 
     if User.objects.filter(email=email).exists(): 
      try: 
       #User exists, use form to update user 
       Profile.objects.get(external_reference=external_reference, user__email=email) 
      except Profile.DoesNotExist: 
       self.add_error('email', 'Email in use') 

    return cleaned_data 

記住使用cleaned_data得到得到電子郵件external_reference和檢查,如果存在的話,因爲如果他們的個人clean_field方法引發了驗證錯誤,那麼他們就不會在cleaned_data,你會再次得到一個KeyError。

PS:如果你是在Django上版之前的1.7使用self._errors [ '電子郵件'] = self.error_class([ '電子郵件中使用'])的代替self.add_error