繁体   English   中英

Django -> 注册新用户 -> 检查用户是否已经通过电子邮件和用户名进行身份验证

[英]Django -> Registering New User -> Check if the user is already authenticated by email and username

我的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM