Django,唯一电子邮件,更新配置文件时出错

Django,唯一电子邮件,更新配置文件时出错,django,email,unique,edit,profile,Django,Email,Unique,Edit,Profile,在我的应用程序中,我遇到了以下问题。在注册过程中,电子邮件地址必须使用自定义的*clean_edit*方法保持唯一。因此,在update_profile表单中,我使用相同的函数(*clean_edit*)检查输入的电子邮件地址是否唯一。如果用户不更改他的电子邮件地址(并且只更改他的名字),那么他会收到一个错误,上面写着“此电子邮件被其他用户使用”。这是因为在更新配置文件表单中,电子邮件地址的占位符具有当前用户的电子邮件地址。因此,当单击提交时,应用程序也尝试更新他的电子邮件地址,但返回错误,即电

在我的应用程序中,我遇到了以下问题。在注册过程中,电子邮件地址必须使用自定义的*clean_edit*方法保持唯一。因此,在update_profile表单中,我使用相同的函数(*clean_edit*)检查输入的电子邮件地址是否唯一。如果用户不更改他的电子邮件地址(并且只更改他的名字),那么他会收到一个错误,上面写着“此电子邮件被其他用户使用”。这是因为在更新配置文件表单中,电子邮件地址的占位符具有当前用户的电子邮件地址。因此,当单击提交时,应用程序也尝试更新他的电子邮件地址,但返回错误,即电子邮件已被使用。下面您可以找到UpdateProfile类的clean_电子邮件

def clean_email(self):
    username = self.cleaned_data.get('username')
    email = self.cleaned_data.get('email')
    if User.objects.filter(email=email).exclude(username=username).exclude(email=email).count():
            raise forms.ValidationError('This email address is already in use. '
                                        'Please supply a different email address.')
    return email

我在这里看不到问题,但我确实看到这段代码有问题。您无法访问clean_foo方法中的其他字段,因为它们可能还不可用。如果您要在验证期间使用多个字段(就像您在这里所做的那样),请替代clean方法

但是,您似乎不需要用户名。我建议改为使用此支票:

if User.objects.filter(email__iexact=email).count() > 0:
        raise forms.ValidationError('This email address is already in use. '
                                    'Please supply a different email address.')

电子邮件是一个不区分大小写的比较。

问题是我从一个教程中获得了这段代码。它应该检查电子邮件地址是否未被其他成员使用。因此,由于我不熟悉Django和python,我不完全明白它为什么使用排除。在我的情况下,我只想检查电子邮件地址是否没有被其他成员使用,但它可以被登录的用户使用。关于这一点有什么想法吗?使用这段代码,如果我处理表单(不更改电子邮件地址),我会得到一个错误,即此电子邮件地址已经在使用中。有点奇怪,不是吗?