我对Django很陌生,我正在try 创建一个预订网站.我希望登录后它应该重定向到我的booking.html页面,但相反,我让这个登录页面总是一遍又一遍地返回登录页面

这是我的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 %}

这是我的urls.py:


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

这是我的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)

这是我的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/'




最后这是我的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

请帮忙,我被困住了,不知道该怎么办

我想要的是登录后会转到booking.html页面

推荐答案

你需要这样写登录路径

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

还删除/.

LOGIN_REDIRECT_URL = 'booking'

将此函数添加到您的views.py中

from django.contrib.auth.views import LoginView 

class AdminLogin(LoginView):
    template_name = "login.html"

之后在登录html中使用django表单不要使用html表单

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

Django相关问答推荐

在Django URL模式中使用多个空路由可以吗?

Django 5.0.2:TypeError:获取切片后无法过滤查询

Django-无法显示基于字段值的元素

django re_path() 函数模式与包含该模式的 url 不匹配

从url参数过滤的Django日期范围返回空查询集

如果上下文中缺少变量,如何使 Django 模板引发错误

AttributeError:'Manager'对象在Django中没有属性'get_by_natural_key'错误?

如何在 Django ORM 中执行 GROUP BY ... COUNT 或 SUM?

用于测试文件下载的 Django 单元测试

删除所有表的django命令是什么?

可以在 Django 抽象模型中使用多重继承吗?

使用 Gunicorn 运行 Django - 最佳实践

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

如何使用 django-nose 运行单个测试或单个 TestCase?

django 静态文件版本控制

如何查询名称包含python列表中任何单词的模型?

刷新时重新提交的django表单

Django Rest 框架 ImageField

Django Admin - save_model 方法 - 如何检测字段是否已更改?

如何 suppress Django 中的弃用警告?