Search code examples
djangodjango-modelsdjango-viewsdjango-templates

Django Project Stuck at Login Page


I'm very new to Django and I am trying to create an booking website. I want that after login it should redirect to my booking.html page, but instead, I had this login page always keep heading back to login page over and over again

This is my login.html :

{% extends 'base.html' %}

{% block content %}
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'css/signin.css' %}">

<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<!-- Bootstrap Bundle with Popper -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>

<div class="row justify-content-center">
    <div class="col-md-4">
        <div class="login-container">
            {% if session.success %}
            <div class="alert alert-success alert-dismissible fade show" role="alert">
                {{ session.success }}
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>
            {% endif %}

            {% if session.loginError %}
            <div class="alert alert-danger alert-dismissible fade show" role="alert">
                {{ session.loginError }}
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>
            {% endif %}

            <div class="row justify-content-center">
                <div class="wow fadeInUp" data-wow-delay="0.1s">
                    <main class="form-signin">
                        <div class="wrapper">
                            <div class="logo">
                                <img src="{% static 'img/logo.png' %}">
                            </div>
                            <br>
                            <div class="text-center mt-4 name">
                                Login Dulu Yuk
                            </div>
                            <br>
                            <form id="loginForm" action="{% url 'login' %}" method="post">
                                {% csrf_token %}
                                <div class="p-3 mt-3">
                                    <div class="form-floating form-field d-flex align-items-center">
                                        <input type="text" name="username" class="form-control rounded {% if form.errors.username %}is-invalid{% endif %}" id="username" placeholder="Username" autofocus required>
                                        <label for="username">Username</label>
                                        {% if form.errors.username %}
                                        <div class="invalid-feedback">
                                            {{ form.errors.username }}
                                        </div>
                                        {% endif %}
                                    </div>
                                    
                                    <div class="form-floating form-field d-flex align-items-center">
                                        <input type="password" name="password" class="form-control rounded" id="password" placeholder="Password">
                                        <label for="password">Password</label>
                                    </div>
                                    <br>
                                    <button class="w-100 btn btn-lg btn-danger" type="submit">Login</button>
                                </div>
                            </form>
                            <small class="d-block text-center mt-3">Belum Register? <a id="registerLink" href="#">Register Sekarang!</a></small>
                        </div>
                    </main>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    $(document).ready(function() {
        $('#registerLink').click(function(e) {
            e.preventDefault();
            window.location.href = "{% url 'register' %}";
        });
    });
</script>
{% endblock %}

this is my urls.py :


    path('login/', LoginView.as_view(next_page='booking'), name='login'),
    

this is my views.py :

from django.shortcuts import render,redirect
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from mysalon.models import tbBooking
from mysalon.models import tbLayanan
from mysalon.forms import FormBooking, FormLayanan
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.contrib.auth.forms import UserCreationForm
from mysalon.resource import BookingResource
from datetime import datetime
from django.urls import reverse
from django.shortcuts import get_object_or_404
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.shortcuts import render, redirect
from mysalon.forms import CustomUserCreationForm
from django.contrib.auth.models import Group
from django.http import JsonResponse
import random
import string
import twilio
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, login
from mysalon.models import CustomUser
from django.contrib.auth import authenticate, login
from django.contrib import messages
from django.shortcuts import render, redirect
from mysalon.models import CustomUser

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # Modifikasi authenticate untuk memeriksa pada CustomUser
        user = CustomUser.objects.filter(username=username).first()
        if user and user.check_password(password):
            authenticated_user = authenticate(request, username=username, password=password)
            if authenticated_user is not None:
                login(request, authenticated_user)
                return redirect('booking')  # Redirect to booking page after successful login
            else:
                messages.error(request, 'Invalid username or password.')
        else:
            messages.error(request, 'Invalid username or password.')
    return render(request, 'login.html')

def index(request):
    now = datetime.now()
    return render(
    request, "index.html",
    {
    'title' : "Glory Salon Booking Online",
    'message1' : "Glory Salon Booking Online",
    'message2' : "Selamat Datang",
    'content' : " pada " + now.strftime("%A, %d %B, %Y at %X")
    }
    )
    
@login_required(login_url=settings.LOGIN_URL)
def booking(request):
    if request.POST:
        kata_kunci = request.POST['cari']
        bk = tbBooking.objects.filter(nama__icontains=kata_kunci)
        isi = {
        'bk' : bk,
}
    else:
        bk = tbBooking.objects.all()
        isi = {
        'bk' : bk
        }
    return render(request,'booking.html', isi)

@login_required(login_url=settings.LOGIN_URL)
def bookingadmin(request):
    if request.POST:
        kata_kunci = request.POST['cari']
        bk = tbBooking.objects.filter(nama__icontains=kata_kunci)
        isi = {
        'bk' : bk,
}
    else:
        bk = tbBooking.objects.all()
        isi = {
        'bk' : bk
        }
    return render(request,'bookingadmin.html', isi)

def about(request):

    return render(request,"about.html")

   
def layanan(request):
    if request.POST:
        kata_kunci = request.POST['cari']
        ly = tbLayanan.objects.filter(namalayanan__icontains=kata_kunci)
        isi = {
        'ly' : ly,
}
    else:
        ly = tbLayanan.objects.all()
        isi = {
        'ly' : ly
        }
    return render(request,'layanan.html', isi)

@login_required(login_url=settings.LOGIN_URL)    
def layananadmin(request):
    if request.POST:
        kata_kunci = request.POST['cari']
        ly = tbLayanan.objects.filter(namalayanan__icontains=kata_kunci)
        isi = {
        'ly' : ly,
}
    else:
        ly = tbLayanan.objects.all()
        isi = {
        'ly' : ly
        }
    return render(request,'layananadmin.html', isi)

def index_book(request):
    return render(request,'index_book.html')

@login_required(login_url=settings.LOGIN_URL)
def tambahbooking(request):
    if request.POST:
        form = FormBooking(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            form = FormBooking()
            pesan = "Selamat bookingan anda sudah tersimpan, silahkan tunggu konfirmasi dari kami"
            isi = {
            'form': form,
            'pesan': pesan,
            }
            return render(request,"tambahbooking.html", isi)
    else:
        form = FormBooking()
        isi = {
            'form' : form,  
            }
    return render(request, 'tambahbooking.html', isi)

@login_required(login_url=settings.LOGIN_URL)
def tambahlayanan(request):
    if request.POST:
        form = FormLayanan(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            form = FormLayanan()
            pesan = "Layanan sudah tersimpan"
            isi = {
            'form': form,
            'pesan': pesan,
            }
            return render(request,"tambahlayanan.html", isi)
    else:
        form = FormLayanan()
        isi = {
            'form' : form,  
            }
    return render(request, 'tambahlayanan.html', isi)

@login_required(login_url=settings.LOGIN_URL)
def ubahbooking(request, kode_id):
    bk = tbBooking.objects.get(kode = kode_id)
    template = "ubahbooking.html"
    if request.POST:
        form = FormBooking(request.POST, request.FILES, instance=bk)
        if form.is_valid():
            form.save()
            messages.success(request, "Data berhasil di-update")
            return redirect('ubahbooking', kode_id = kode_id)
    else:
        form = FormBooking(instance=bk)
        isi = {
        'form':form,
        'bk':bk,
        }
        return render(request,template,isi)

@login_required(login_url=settings.LOGIN_URL)
def ubahlayanan(request, namalayanan_id):
    ly = tbLayanan.objects.get(namalayanan = namalayanan_id)
    template = "ubahlayanan.html"
    if request.POST:
        form = FormLayanan(request.POST, request.FILES, instance=ly)
        if form.is_valid():
            form.save()
            messages.success(request, "Data berhasil di-update")
            return redirect('http://127.0.0.1:8000/layananadmin')
    else:
        form = FormLayanan(instance=ly)
        isi = {
        'form':form,
        'ly':ly,
        }
        return render(request,template,isi)


def hapusbooking(request, kode_id):
    bk = tbBooking.objects.filter(kode = kode_id)
    bk.delete()
    messages.success(request, "Data Berhasil dihapus!")
    return redirect('booking')

def hapuslayanan(request, namalayanan_id):
    ly = tbLayanan.objects.filter(namalayanan = namalayanan_id)
    ly.delete()
    messages.success(request, "Data Berhasil dihapus!")
    return redirect('layanan')


def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')  # Redirect to login page after successful registration
    else:
        form = CustomUserCreationForm()
    return render(request, 'register.html', {'form': form})

def registeradmin(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_staff = True  # Menjadikan user sebagai staff
            user.save()
            
            # Menambahkan user ke grup 'Admin' jika grup tersebut sudah ada
            try:
                admin_group = Group.objects.get(name='Admin')
            except Group.DoesNotExist:
                admin_group = Group.objects.create(name='Admin')
                pass
            
            # Menambahkan user ke grup 'Admin' jika grup tersebut sudah ada
            if admin_group:
                user.groups.add(admin_group)
                
            return redirect('login')  # Redirect to login page after successful registration
    else:
        form = CustomUserCreationForm()
    return render(request, 'registeradmin.html', {'form': form})

def registerowner(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_superuser = True
            user.is_staff = True# Menjadikan user sebagai staff
            user.save()
            
            # Menambahkan user ke grup 'Admin' jika grup tersebut sudah ada
            try:
                admin_group = Group.objects.get(name='Owner')
            except Group.DoesNotExist:
                admin_group = Group.objects.create(name='Owner')
                pass
            
            # Menambahkan user ke grup 'Admin' jika grup tersebut sudah ada
            if admin_group:
                user.groups.add(admin_group)
                
            return redirect('login')  # Redirect to login page after successful registration
    else:
        form = CustomUserCreationForm()
    return render(request, 'registerowner.html', {'form': form})

def export_xls(request):
    booking = BookingResource()
    dataset = booking.export()
    response = HttpResponse(dataset.xls, content_type = "application/vnd.ms-excel")

    response['content-disposition'] = 'attachment; filename=Laporan Booking Anda.xls'
    return response

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def delete_user(request, user_id):
    if not request.user.has_perm('auth.delete_user'):
        return Response({'error': 'You do not have permission to delete users.'}, status=status.HTTP_403_FORBIDDEN)

    # Delete user logic
    return Response({'success': 'User deleted successfully.'}, status=status.HTTP_200_OK)

this is my settings.py :


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

LOGIN_REDIRECT_URL = 'booking/'

LOGIN_URL = 'login/'




and lastly this is my models.py :

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, Group


class CustomUserManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError('The Email field must be set')
        if not username:
            raise ValueError('The Username field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password=None):
        user = self.create_user(email=email, username=username, password=password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class CustomUser(AbstractBaseUser):
    nama = models.CharField(max_length=50)
    alamat = models.TextField()
    nohp = models.CharField(max_length=15)
    email = models.EmailField(max_length=50, unique=True)
    username = models.CharField(max_length=50, unique=True)
    password = models.CharField(max_length=50)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    groups = models.ManyToManyField(Group, blank=True, related_name='custom_users')

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

    objects = CustomUserManager()

    def __str__(self):
        return self.email
    



class tbLayanan(models.Model):
    namalayanan = models.CharField(max_length=50)
    harga = models.IntegerField()

    def __str__(self):
        return self.namalayanan


class tbStatus(models.Model):
    namastatus = models.CharField(max_length=50)

    def __str__(self):
        return self.namastatus


class tbBooking(models.Model):
    kode = models.CharField(max_length=9, unique=True)
    nama = models.CharField(max_length=50, unique=True)
    namalayanan = models.ForeignKey(tbLayanan, on_delete=models.CASCADE, related_name='namalayanan_bookings')
    desk = models.TextField(blank=True, null=True)
    tanggal = models.DateTimeField(auto_now_add=True, null=True)
    waktu = models.TimeField()
    harga = models.ForeignKey(tbLayanan, on_delete=models.CASCADE, related_name='harga_bookings')
    namastatus = models.ForeignKey(tbStatus, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.kode

please help, i'm stuck and don't know what to do

what i want is that after login it heads to booking.html page


Solution

  • You need to write login path like this

    path('login/', LoginView.as_view(), name='login'),
    

    Also remove / .

    LOGIN_REDIRECT_URL = 'booking'
    

    Add this func in your views.py

    from django.contrib.auth.views import LoginView 
    
    class AdminLogin(LoginView):
        template_name = "login.html"
    

    after that use django form in login html don't use html form

    <form method="POST">
        {{form.as_p}}
        <button type="submit" ></button>
    </form>