首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我希望电子邮件必须是唯一的

我希望电子邮件必须是唯一的
EN

Stack Overflow用户
提问于 2021-02-20 22:48:42
回答 2查看 50关注 0票数 1

当创建一个新的用户,我希望该电子邮件必须是唯一的每个用户,没有用户可以两次相同的电子邮件

views.py

代码语言:javascript
运行
复制
def register(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            email = form.cleaned_data.get('email')
            return redirect('/login/')
    else:
        form = SignUpForm()
    return render(request, 'register.html', {'form': form})

forms.py

代码语言:javascript
运行
复制
class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=True, help_text='Required.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, required=True, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2',)

但这不是工作用户用相同的电子邮件创建的这是我的方法任何建议

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-20 22:53:56

您可以通过实现clean_email方法中的SignUpForm:

代码语言:javascript
运行
复制
from django.core.exceptions import ValidationError 

class SignUpForm(UserCreationForm):

    # …

    def clean_email(self):
        email = self.cleaned_data['email']
        qs = User.objects.exclude(pk=self.instance.pk).filter(email__iexact=email)
        if qs.exists():
            raise ValidationError('A user with this email address already exists')
        return email

The SignUpForm将运行clean_email方法。因此,我们可以查看是否存在User

具有相同电子邮件地址的对象(我们使用大小写无意义匹配),但不是当前对象(我们排除pk=self.instance.pk为了避免在发生以下情况时引发错误,更新对象)。

在这种情况下User存在,则会引发验证错误。Django将确保将此错误附加到名为email由于我们将clean方法命名为clean_email..。

票数 0
EN

Stack Overflow用户

发布于 2021-02-20 23:54:28

我的第一个直觉是在模型级别将其作为约束来实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66292877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档