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: