简体   繁体   中英

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

I have the following code in my register_view function. When I register a new user it updates in the database, but I want to check whether a user has already been authenticated by email or user.

I have tried request.user.is_authenticated but this always returns true, and the request body is always saving when I fire a new POST call.

@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)


--> User Model

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

--> Registration Form

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.")

Check request.user.is_authenticated in your view before you start saving the form. If it's true, then redirect the user to another page:

@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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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