2017-01-03 108 views
1

我已經開始在Django中創建一個網站,我試圖爲它編寫單元測試,但是,我無法讓這個單元測試通過。Django過濾器()。exists總是返回false

def test_email_already_in_use(self): 
    user_email = '[email protected]' 
    password = 'testing_password' 
    User.objects.create_user(username=user_email, password=password) 
    tmp = User.objects.filter(email=user_email).exists() 
    form_data = {'email': user_email, 'password': password} 

    with self.assertRaises(ValidationError): 
     form = UserForm(data=form_data) 
     form.clean_email() 

的問題是,TMP始終是假的(TMP只是用來幫我調試,而無需任何一步進一步。該存在檢查在clean_email完成正常)。但是,當我運行代碼的網站正常運行時,嘗試使用現有電子郵件創建新用戶。我明顯錯過了create_user的工作原理。

這是在我嘗試使用相同電子郵件創建新用戶時正確檢查已使用的電子郵件的代碼。

def clean_email(self): 
    email = self.data['email'] 

    if User.objects.filter(email=email).exists(): 
     raise ValidationError("Email already in use") 
    if len(email) > 100: 
     raise ValidationError("Email length exceeds 100") 

    return email 

回答

1

如果您使用的是django.contrib.auth.models.User,則用戶名和電子郵件字段不同。下面的代碼行不創建一個對象,在電子郵件領域

User.objects.create_user(username=user_email, password=password) 

因此,你的存在給定的電子郵件地址查詢確實應該

tmp = User.objects.filter(username=user_email).exists() 
+0

這是我的一個非常愚蠢的錯誤,謝謝爲了指出這一點。我也意識到它在我看來是有效的,因爲我在單元測試中錯過了email = user_email。 – FrozenHawk

+0

適合每個人 – e4c5