当创建一个新的用户,我希望该电子邮件必须是唯一的每个用户,没有用户可以两次相同的电子邮件
views.py
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
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',)但这不是工作用户用相同的电子邮件创建的这是我的方法任何建议
发布于 2021-02-20 22:53:56
您可以通过实现clean_email方法中的SignUpForm:
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 emailThe SignUpForm将运行clean_email方法。因此,我们可以查看是否存在User
具有相同电子邮件地址的对象(我们使用大小写无意义匹配),但不是当前对象(我们排除pk=self.instance.pk为了避免在发生以下情况时引发错误,更新对象)。
在这种情况下User存在,则会引发验证错误。Django将确保将此错误附加到名为email由于我们将clean方法命名为clean_email..。
发布于 2021-02-20 23:54:28
我的第一个直觉是在模型级别将其作为约束来实现。
https://stackoverflow.com/questions/66292877
复制相似问题