Django - While registering, registered data are not saved on database and so can't perform LogIn

118 views Asked by At

I have been trying so hard to make an user registration and login using Django. I am using AbstractUser for this. Whenever, I enter the form fields, and click Signup the page is not getting redirected and the entered data aren't saved on the database

This is my view.py

    def register(request):

        if request.method == "POST":
            print("method is post")
            form = UserRegisterForm(request.POST or None)
            if form.is_valid():
                print("form is valid")
                form.save()
                username = form.cleaned_data.get("username")
                messages.success(request, f"hey {username}, account created successfully")
                new_user = authenticate(username=form.cleaned_data['email'],
                                    password=form.cleaned_data['password1'])
                login(request, new_user)
                return redirect("jew_app:home")
            else:
                print(form.errors)
        else:
            print("user can't be registered")

        form = UserRegisterForm()

        context = {
            'form': form
        }
        return render(request, 'user/register.html',  context)


    def user_login(request):
        if request.user.is_authenticated:
            messages.warning(request, f"Hey you are already logged in")
            return redirect("accounts:profile")

        if request.method == "POST":
            email = request.POST.get("email")
            password = request.POST.get("password")

            try:
                user = User.objects.get(email=email)
                user = authenticate(request, email=email, password=password)

                if user is not None:
                    login(request, user)
                    messages.success(request, "You are logged in")
                    return redirect("jew_app:home")
                else:
                    messages.warning(request, "User Does Not Exist. Create an account")

            except:
                messages.warning(request, f"User with {email} does not exist")

        context = {

        }

        return render(request, 'user/login.html', context)

models.py

    class User(AbstractUser):
        email = models.EmailField(unique=True, null=False)
        username = models.CharField(max_length=100)
        dob = models.DateField(null=True, blank=True)
        mobile_number = models.CharField(max_length=10, null=True, blank=True)


        USERNAME_FIELD = "email"
        REQUIRED_FIELDS = ['username']

        def __str__(self):
            return self.username

I tried Django built-in form etc. I was able to create the superuser and the superuser details are stored in database but the users after registering the superuser through form fields are not getting stored in database.

2

There are 2 answers

2
Zatigem On

Don’t use form.is_valid(), form.save(), or any custom register form like UserRegisterForm.

Instead, in your register() view you must create an User entry with create_user(). Follow the documentation:

username = request.POST.get("username")

# Manage username conflict here...

User.objects.create_user(username, request.POST.get("email"), request.POST.get("password"))
messages.success(request, f"hey {username}, account created successfully")
user = authenticate(...)
if user is not None:
    # Do something with the authenticated user...
else:
    # Do something in case of error...

Also you must manage any username conflict. If two users have the same email address, you must for example refuse the registration.

0
Zatigem On

Reuse Django’s UserCreationForm.

Follow the documentation about Substituting a custom user model.

Then your registration form may looks like:

class UserRegisterForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = User
        fields = ("username", "password1", "password2", "email",)

    # Some customization…

Also, you’ll have to write your own user manager, so something like :

class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError("Users must have an email address")

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self, email, password=None):
        user = self.create_user(
            email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user