why is my signup and login not created and authenticated when I put it in the same function in my django project?

38 Views Asked by At

initally I seperate the registration and loginUser function on my views.py, which work just fine creating the user. user created on DB and logout also works fine. but I had problems with the login that it won't log the user in withou giving any error alert. I figured that me putting the login and signup form in the same html file might be the problem so I tried to merge the register and loginUser function

def registerUser(request):
    form = CreateUserForm()

    if request.method=="POST":
        form = CreateUserForm(request.POST)
        if form.is_valid():
            form.save()
            user = form.cleaned_data.get('username')
            messages.success(request, 'Account was created for ' + form.cleaned_data.get('username'))
            email = form.cleaned_data.get('email')

            Customer.objects.create(username=User.objects.get(username=user), email=email)
            return redirect('register')

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

def loginUser(request):
    if request.method =="POST":
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)
        if user:
            login(request, user)
            return redirect('store')
        else:
            messages.info(request, 'Incorrect username or password')
    context={}
    return render(request, 'store/login.html',context)

here are the merged function

views.py

from django.shortcuts import render, redirect
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect
import json
import datetime

from .models import *
from . utils import cookieCart, cartData, guestOrder

# for userCreation
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from .forms import CreateUserForm, LoginForm
from django.contrib import messages

# authenticate user
from django.contrib.auth import authenticate, login, logout

# Create your views here

@csrf_protect
def register_or_login(request):
    register_form = CreateUserForm()
    login_form = LoginForm()  # You might want to create a specific form for login

    if request.method == "POST":
        if "register" in request.POST:
            register_form = CreateUserForm(request.POST)
            if register_form.is_valid():
                register_form.save()
                user = register_form.cleaned_data.get('username')
                email = register_form.cleaned_data.get('email')
                # Additional actions for registration if needed
                messages.success(request, 'Account was created for ' + user)
                return redirect('store')  # Redirect to store after successful registration
        elif "login" in request.POST:
            login_form = LoginForm(request.POST)
            if request.method == "POST":
                username = request.POST.get('username')
                password = request.POST.get('password')
                
                user = authenticate(request, username=username, password=password)
                if user:
                    login(request, user)
                    return redirect('store')  # Redirect to store after successful login
                else:
                    messages.info(request, 'Incorrect username or password')

    context = {'register_form': register_form, 'login_form': login_form}
    return render(request, 'store/register_login.html', context)

register_login.html

<!DOCTYPE html>
{% load static %}
<html lang="en" dir="ltr">
<head>
    <meta charset="utf-8">
    <title>Sign Up | Log In</title>

    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@100;300;600&family=Seaweed+Script&display=swap" rel="stylesheet">

    <link rel="stylesheet" href="{% static "css/login.css" %}">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <div class="wrapper">
        <div class="title-text">
          <div class="title login">Welcome to Viola</div>
          <div class="title signup">Register Account</div>
        </div>
        <div class="form-container">
          <div class="slide-controls">
            <input type="radio" name="slide" id="login" checked>
            <input type="radio" name="slide" id="signup">
            <label for="login" class="slide login">Login</label>
            <label for="signup" class="slide signup">Signup</label>
            <div class="slider-tab"></div>
          </div>
          <div class="form-inner">
            <form action="#" method="POST" class="login" id="login-form">
              {% csrf_token %}
              <div class="field">
                {% comment %} <input type="text" placeholder="Username" required> {% endcomment %}
                {{ login_form.username }}
              </div>
              <div class="field">
                {% comment %} <input type="password" placeholder="Password" required> {% endcomment %}
                {{ login_form.password }}
              </div>
      
              <div class="field btn">
                <div class="btn-layer"></div>
                <input type="submit" value="Log In" name="login">
              </div>
              <div class="signup-link">Not a member? <a href="">Signup now</a></div>
            </form>
            <form action="#" method="POST" class="signup" id="signup-form">
              {% csrf_token %}
              <div class="field">
                {{ register_form.username }}
              </div>
               <div class="field">
                {{ register_form.email }}
                {% comment %} <input type="email" placeholder="Email Address" required> {% endcomment %}
              </div>
              <div class="field">
                {{ register_form.password1 }}
                {% comment %} <input type="password" placeholder="Password" required> {% endcomment %}
              </div>
              <div class="field">
                {{ register_form.password2 }}
                {% comment %} <input type="password" placeholder="Confirm password" required> {% endcomment %}
              </div>
              <div class="field btn">
                <div class="btn-layer"></div>
                <input type="submit" value="Sign Up" name="register">
              </div>
            </form>
          </div>
        </div>
      </div>
  
    <script>
        // Get form fields
        let loginFormFields = document.getElementById("login-form").getElementsByTagName("input");
        let signupFormFields = document.getElementById("signup-form").getElementsByTagName("input");
        
        // Set placeholders
        loginFormFields[1].placeholder = "Username";
        loginFormFields[2].placeholder = "Password";

        signupFormFields[1].placeholder = "Username";
        signupFormFields[2].placeholder = "Email Address";
        signupFormFields[3].placeholder = "Password";
        signupFormFields[4].placeholder = "Confirm Password";
    </script>
  
    <script>
        // Your existing JavaScript code
        const loginText = document.querySelector(".title-text .login");
        const loginForm = document.querySelector("form.login");
        const loginBtn = document.querySelector("label.login");
        const signupBtn = document.querySelector("label.signup");
        const signupLink = document.querySelector("form .signup-link a");
        signupBtn.onclick = (()=>{
          loginForm.style.marginLeft = "-50%";
          loginText.style.marginLeft = "-50%";
        });
        loginBtn.onclick = (()=>{
            loginForm.style.marginLeft = "0%";
            loginText.style.marginLeft = "0%";
        });
        signupLink.onclick = (()=>{
          signupBtn.click();
          return false;
        });
    </script>
</body>
</html>

I tried changing the submit name and redirecting page, but still not working

0

There are 0 best solutions below