2017-01-03 114 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