python - Django -> 注册新用户 -> 检查用户是否已经通过电子邮件和用户名进行身份验证
问题描述
我的 register_view 函数中有以下代码。当我注册一个新用户时,它会在数据库中更新,但我想检查一个用户是否已经通过电子邮件或用户的身份验证。
我已经尝试过 request.user.is_authenticated 但这总是返回 true,并且当我发起新的 POST 调用时,请求正文总是在保存。
@csrf_exempt
def register_view(request):
if request.POST:
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
email = form.cleaned_data.get('email').lower()
raw_password = form.cleaned_data.get('password1')
account = authenticate(email=email, password=raw_password)
login(request, account)
return JsonResponse(f'User {email} : {username} has been registered.', status=200, safe=False)
else:
form = RegistrationForm()
return JsonResponse('You are missing some fields.', status=422, safe=False)
--> 用户模型
class User(AbstractBaseUser):
firstname = models.CharField(max_length=30)
lastname = models.CharField(max_length=30)
email = models.EmailField(verbose_name="email address", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
last_login = models.DateTimeField(verbose_name="last login", auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'firstname', 'lastname']
class Meta:
db_table = "users"
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self, app_label):
return True
--> 登记表
class RegistrationForm(UserCreationForm):
email = forms.EmailField(max_length=255, help_text="Email address required.")
firstname = forms.CharField(max_length=30, help_text="First name required.")
lastname = forms.CharField(max_length=30, help_text="Last name required")
class Meta:
model = User
fields = ('firstname', 'lastname', 'email', 'username', 'password1', 'password2')
def clean_email(self):
email = self.cleaned_data['email'].lower()
try:
user = User.objects.get(email=email)
except Exception as e:
return email
raise forms.ValidationError(f"Email {email} is already in use.")
def clean_username(self):
username = self.cleaned_data['username']
try:
user = User.objects.get(username=username)
except Exception as e:
return username
raise forms.ValidationError(f"Username {username} is already in use.")
解决方案
在开始保存表单之前检查request.user.is_authenticated
您的视图。如果为真,则将用户重定向到另一个页面:
@csrf_exempt
def register_view(request):
if request.user.is_authenticated:
return redirect('url-to-some-other-page')
if request.method == 'POST':
# ... other code remains the same
推荐阅读
- mongodb - 查找日期范围内和点距离内的所有文档
- r - 对于闪亮的 DT,如何同时使用 FormatStyle 和 Extension ?
- swift - 无法通过包管理器将 SwiftCalendar 添加为 vapor3 项目中的依赖项
- primeng - PrimeNg 时间表不显示分钟数
- php - PHP WHERE 子句 MySQL 中的许多变量
- excel - EXCEL VBA:激活自动图形绘制的按钮
- java - 使用 buffWrite 或 FileWriter 将 xml 文件拆分为多个文件
- r - 如何使用 sink() 在 Jupyter notebook 中保存 R 输出?
- mvvm - 命名空间 MvvmCross.Forms 中不存在类型或命名空间平台
- c# - 如何过滤另一个列表中的对象列表