簡體   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