使用该用户名的Django用户已经存在



我的目标-尝试在Django中创建一个身份验证系统,并允许用户在帐户未激活的情况下使用相同的用户名再次注册。

如果用户尝试使用某个用户名注册,而该用户名已经存在,则使用当前用户更新该用户。

我的方法-我使用";UserCreationForm";以及定义我自己的方法来验证表单,并允许用户,即使用户名已经存在,但user.is_active=False。

代码

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import User
class SignupForm(UserCreationForm):
email = forms.EmailField(max_length=200, help_text='Required')
name = forms.CharField()
institution = forms.CharField()
def clean_username(self):
username = self.cleaned_data.get('username')
user = None
try:
try:
user = User.objects.get(username=username)
print("is user active username", user.is_active)
except ObjectDoesNotExist as e:
pass
except Exception as e:
raise e
if not user:
pass
elif not user.is_active:
pass
else:
raise forms.ValidationError("This Username Already Exists")
except Exception as e:
raise e
return username
class Meta:
model = User
fields = ('username', 'email', 'institution', 'password1', 'password2')

views.py

from .forms import SignupForm
def regUser(form):
'''
It will save Django user and student.
It recieves form.cleaned_data as argument
'''
print("reg user line 1")
user = User.objects.create_user(username=form['username'],
email=form['email'], 
password=form['password1'],
is_active=False,
)
# notice is_active = False, becuase we will activate account if user will
# verify the email
user.save()
student = Student(user=user, name=form['name'], institution=form['institution'])
student.save()
return user
def signup(request):
if request.user.is_authenticated:
return redirect('accounts:home')
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
user = regUser(form.cleaned_data)
current_site = get_current_site(request)
message = render_to_string('accounts/acc_active_email.html', {
'user':user, 'domain':current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
mail_subject = 'Activate your account.'
to_email = form.cleaned_data.get('email')
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
return render(request, 'accounts/signup.html', {'email_sent': True})
else:
for field in form:
for error in field.errors:
messages.error(request, error)
return redirect("accounts:signup")
return render(request, 'accounts/signup.html')

型号.py

from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
subject = models.CharField(max_length=250, default="default_value")

class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
name = models.CharField(max_length=250, default="default_value")
institution = models.CharField(max_length=250, default="default_value")
def save(self):
super().save()
def __str__(self):
return self.user.username

我的问题-我出错了"具有该用户名的用户已经存在";当我试图用已经注册的用户名创建一个新用户,但它的帐户尚未激活(user.is_active=False(时,我不知道为什么会出现这个错误。

据我所知,当我们使用";form.is_valid(("在我们看来.py,但我已经覆盖了";clean_username";根据我的需要,为什么我会出现这个错误?它是从哪里产生的?以及如何解决这个问题

此外,我想提及的是,当用户被注册时;学生;这就是为什么我使用";regUser";作用此外,我在stackoverflow上读到了一些类似的其他问题,一些答案是继承了";表格。形式";而不是来自";UserCreationForm";但为什么有人能解释呢?

请不要将此问题标记为已回答我已经完成了所有问题,但没有帮助。

您定义的用户模型继承了AbstactUser,在那里定义了username

class AbstractUser(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
admin-compliant permissions.
Username and password are required. Other fields are optional.
"""
username_validator = UnicodeUsernameValidator()
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
validators=[username_validator],
error_messages={
'unique': _("A user with that username already exists."),
},
)
...

username字段的属性unique意味着用户名在所有用户中必须是唯一的,而不仅仅是

活动用户如果您希望允许用户在非活动用户中使用相同的用户名,请设置unique=False。

但是,如果在User模型中"inactive"意味着"丢弃",我建议在用户被停用时将用户的username更改为垃圾值。

最新更新