在 Django 中编辑用户配置文件时检查重复的电子邮件

Posted

技术标签:

【中文标题】在 Django 中编辑用户配置文件时检查重复的电子邮件【英文标题】:Checking duplicate email when editing user profile in Django 【发布时间】:2018-02-07 07:04:30 【问题描述】:

当我以用户身份登录并编辑我自己的个人资料时,我正在尝试检查重复的电子邮件。

但是当输入的电子邮件是当前登录用户的电子邮件并且我不想更新我当前的电子邮件时,我也会收到重复的电子邮件错误消息。

accounts/forms.py

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = models.Profile
        fields = ("organisation", "phone_number")

    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    phone_number = PhoneNumberField(label=_("Phone (Please state your country code eg. +44)"))
    organisation = forms.CharField(max_length=30)
    email = forms.EmailField()


    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        self.initial['first_name'] = self.instance.user.first_name
        self.initial['last_name'] = self.instance.user.last_name
        self.initial['email'] = self.instance.user.email

    helper = FormHelper()
    helper.layout = Layout(
        Div(
            Field("first_name", wrapper_class="col-sm-6"),
            Field("last_name", wrapper_class="col-sm-6"),
            css_class = "row"
        ),
        Div(
            Field("organisation", wrapper_class="col-sm-6"),
            Field("email", wrapper_class="col-sm-6"),
            css_class = "row"
        ),
        Div(
            Field("phone_number", wrapper_class="col-sm-6"),
            css_class = "row"
        ),
    )

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email and User.objects.filter(email=email).exists():
            raise forms.ValidationError(u'Please use a different email address.')
            return email

    def save(self, commit=True, *args, **kwargs):
        self.instance.user.first_name = self.cleaned_data['first_name']
        self.instance.user.last_name = self.cleaned_data['last_name']
        self.instance.user.email = self.cleaned_data['email']
        self.instance.user.save()
        return super(UserProfileForm, self).save(commit, *args, **kwargs)

如何检查输入的电子邮件是否为新电子邮件,如果是新电子邮件,则检查重复功能,否则忽略电子邮件字段并更新其他字段。

非常感谢任何帮助/建议。提前致谢。

【问题讨论】:

你好,你能看看这篇文章吗,这可能对你有帮助check if email exist or not 【参考方案1】:

在您的filter 之后使用exclude 过滤器,以便从您的查询中排除当前登录的用户。文档here:

User.objects.filter(email=email).exclude(id=self.user.id)

这确实意味着您的视图需要将当前用户传递给表单,因此您应该将其作为 init 参数添加到表单初始化中(以便self.user = user

【讨论】:

我正在弹出表单中编辑用户配置文件,并且表单已经有当前用户。 form = POPUP_FORMS[key]['form'](instance=instance, initial="user": request.user) 已排序。我不得不在 __init__function 下使用self.user = self.instance.user。非常感谢您的帮助。

以上是关于在 Django 中编辑用户配置文件时检查重复的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在管理界面中内联编辑 django 用户配置文件?

使用 Django 表单编辑图像字段

Django 使用基于类的视图编辑用户配置文件

如何在我的Django模板上删除“未设置密码”以编辑配置文件

如何使用 Django 的 HTML 表单来编辑用户配置文件的一部分。

填写个人资料字段时,管理员中的 Django 用户创建失败