Django错误:UNIQUE约束失败:auth_user.username

disbfnqx  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(172)

我需要通过发送激活令牌到她的电子邮件地址来注册用户。我收到此错误(UNIQUE约束失败:auth_user.username),当尝试使用自定义内置函数registeractivate注册她时。
代码如下:

forms.py

class UserRegisterForm(forms.Form, UserCreationForm):

username = forms.CharField(max_length=20)
date_of_birth = forms.DateField(widget=forms.SelectDateWidget(years=range(2017, 1900, -1)))
email = forms.EmailField()

def clean_username(self):
    username = self.cleaned_data.get('username')
    if User.objects.filter(username__iexact=username).exists():
        raise forms.ValidationError('Username already exists')
    return username

def clean_date_of_birth(self):
    '''
    Only accept users aged 13 and above
    '''
    userAge = 13
    dob = self.cleaned_data.get('date_of_birth')
    today = date.today()
    if (dob.year + userAge, dob.month, dob.day) > (today.year, today.month, today.day):
        raise forms.ValidationError('Users must be aged {} years old and above.'.format(userAge))
    return dob

def clean_email(self):
    email = self.cleaned_data.get('email')
    if User.objects.filter(email__iexact=email).exists():
        raise forms.ValidationError('A user has already registered using this email')
    return email

def clean_password2(self):
    '''
    we must ensure that both passwords are identical
    '''
    password1 = self.cleaned_data.get('password1')
    password2 = self.cleaned_data.get('password2')
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError('Passwords must match')
    return password2

views.py

def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    if form.is_valid():
        username = form.cleaned_data.get('username')
        email = form.cleaned_data.get('email')
        password = form.cleaned_data.get('password1')
        new_user = User.objects.create(username=username, email=email, password=password)
        new_user = form.save(commit=False)
        #new_user.set_password(password) # hashes the password
        new_user.is_active = False
        new_user.save()
        current_site = get_current_site(request)
        message = render_to_string('email_activation_link.html', {
            'new_user':new_user,
            'domain':current_site.domain,
            'uid': urlsafe_base64_encode(force_bytes(new_user.pk)),
            'token': account_activation_token.make_token(new_user),
        })
        mail_subject = 'Activate your Frac account.'
        #to_email = form.cleaned_data.get('email')
        email = form.cleaned_data.get('email')
        to_email = EmailMessage(mail_subject, message, to=[email])#[to_email])
        to_email.send()
        return render(request, 'register_confirm.html', {'form': form})
else:
    form = UserRegisterForm()

return render(request, 'register.html', {'form': form})

spec_backend = 'django.contrib.auth.backends.ModelBackend'

def activate(request, uidb64, token):
try:
    uid = force_text(urlsafe_base64_decode(uidb64))
    new_user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExist):
    new_user = None
if new_user is not None and account_activation_token.check_token(new_user, token):
    new_user.is_active = True
    new_user.save()
    return render(request, 'register_complete.html', {})
else:
    return render(request, 'registration_incomplete.html', {})

是什么导致了这样的错误?我在这个平台上研究了类似的帖子,但每个案例都是独一无二的。

i1icjdpr

i1icjdpr1#

由于您尝试两次创建相同的用户,因此会出现唯一约束错误:

new_user = User.objects.create(username=username, email=email, password=password)
new_user = form.save(commit=False)
...
new_user.save()

由于您使用的是模型表单,因此不需要手动调用User.objects.create()。把那条线拿掉。您还可以删除上面从清理后的数据中获取用户名、电子邮件和密码的三行。

qcuzuvrc

qcuzuvrc2#

不需要这种令人困惑的答案,这里有一个最简单的答案,可以添加到views.py,无论你在哪里处理你的注册表单。
它将只显示错误而不显示默认值
(* 不要复制这个)

UNIQUE constraint failed auth_user.username

代码如下:
(* 复制这一个)

if User.objects.filter(username = username).first():
        messages.error(request, "This username is already taken")
        return redirect('home')

相关问题