Django 更改用户';电子邮件地址

Django 更改用户';电子邮件地址,django,django-models,django-forms,Django,Django Models,Django Forms,我正在构建一个简单的表单,允许用户更改他的基本(名字和姓氏,电子邮件)数据。 我想确定: 电子邮件在数据库中仍然是唯一的 用户可以不动他的电子邮件 用户可以更改他的电子邮件 我想用ModelForm来做这个。我已经完成了一些类似于: class UserDataForm(ModelForm): class Meta: model = User fields = ['first_name', 'last_name', 'email'] def

我正在构建一个简单的表单,允许用户更改他的基本(名字和姓氏,电子邮件)数据。 我想确定:

  • 电子邮件在数据库中仍然是唯一的
  • 用户可以不动他的电子邮件
  • 用户可以更改他的电子邮件
我想用ModelForm来做这个。我已经完成了一些类似于:

class UserDataForm(ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email']

    def clean_email(self):
        cd = self.cleaned_data
        email = cd['email']
        # Not sure how to check is there is an other account which uses this email EXCEPT this particular user account
我需要显示验证错误消息时,有另一个帐户使用相同的电子邮件,这个帐户不是由用户谁是填写表单拥有

我不知道如何做到这一点。

试试这个:

class UserDataForm(ModelForm):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email']

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

        # object is exists and email is not modified, so don't start validation flow
        if self.instance.pk is not None and self.instance.email == email:
            return cd

        # check email is unique or not
        if User.objects.filter(email=value).exists():
            raise forms.ValidationError("Email address {} already exists!".format(value))
        return cd
看看这个,我想会有帮助的

另一种方法是尝试使用“干净”方法检查电子邮件:

def clean(self):
    cleaned_data = self.cleaned_data

    if 'email' in self.changed_data and User.objects.filter(email=value).exists():
        raise forms.ValidationError("Email address {} already exists!".format(value))

return cleaned_data

若用户只想更改姓和名,该怎么办?电子邮件将保持不变,但表单将不会验证(因为存在具有此类电子邮件地址的用户对象)。