Django: Получение кнопки для отмены бронирования из базы данных

Немного контекста для моего вопроса:

Мой текущий проект - это домашняя страница бронирования квартир на Django (включая allauth). В зависимости от того, кто вошел в систему, отображается разный контент. Когда обычный пользователь (гость) входит на сайт, отображается подстраница Booking "your-bookings.html" с обзором бронирований отдельных гостей. Когда суперпользователь (хозяин квартиры) входит в систему, отображается подстраница Booking "all-bookings.html" с обзором бронирований всех гостей. Я добавил кнопки "отменить" на эти страницы, чтобы гость мог отменить свое бронирование, нажав на кнопку, которая устанавливает статус бронирования с "запрошено" на "отменено" в базе данных. Такая же функция должна быть доступна и для хозяина в отношении всех бронирований гостей.

your-bookings.html (функциональность работает, как и ожидалось)

<h1>Your Bookings</h1>

{% if user.is_authenticated %}
{% for booking in object_list %}

<div class="card mx-auto" style="width:25rem;background-color:#e4dee8;">
    <div class="card-body">
        <h3 class="card-title">Booking number {{booking.id}}</h3><br>
        <h6 class="card-subtitle mb-2 text-body-secondary">
            <b>Booking date:</b><br>{{booking.booking_date}}<br><br>
            <b>Status:</b> {{booking.booking_status}}<br><br>
        </h6>
        <p class="card-text">
            <b>Name:</b><br>
            {{booking.first_name}} {{booking.last_name}}<br>
            [...]
            <b>Your message:</b><br>
            {{booking.message}}<br>
        </p>
        {% if booking.booking_status == "Requested" %}
        <button class="btn btn-card-cancel cancel border-dark" data-booking_id="{{ booking.id }}">Cancel Booking</button>
        {% endif %}
    </div>
</div>
<br>

{% endfor %}
{% endif %}

all-bookings.html (функциональность работает не так, как ожидалось)

<h1>All Bookings</h1>

{% if user.is_superuser %}
{% for bookings in object_list %}

<div class="card mx-auto" style="width:25rem;background-color:#e4dee8;">
    <div class="card-body">
        <h3 class="card-title">Booking number {{bookings.id}}</h3><br>
        <h6 class="card-subtitle mb-2 text-body-secondary">
            <b>Booking date:</b><br>{{bookings.booking_date}}<br><br>
            <b>Status:</b> {{bookings.booking_status}}<br><br>
        </h6>
        <p class="card-text">
            <b>Name:</b><br>
            {{bookings.first_name}} {{bookings.last_name}}<br>
            [...]
            <b>Your message:</b><br>
            {{bookings.message}}<br>
        </p>

        {% if bookings.booking_status == "Requested" %}
        <button data-booking_id="{{ booking.id }}" class="btn btn-card-cancel cancel border-dark">Cancel
            Booking</button><br><br>
        {% endif %}
    </div>
</div>
<br>

{% endfor %}
{% endif %}

urls.py

from django.urls import path
from . import views


urlpatterns = [
    path('your-bookings/', views.BookingList.as_view(), name='your-bookings'), 
    path('all-bookings/', views.AllBookingsList.as_view(), name='all-bookings'),
    path('cancel_booking/<int:booking_id>', views.cancel_booking, name='cancel_booking'),
]

views.py


def cancel_booking(request, booking_id):
    """
    Functionality to cancel a booking
    """
    booking = get_object_or_404(Booking, pk=booking_id)
        
    if booking.user == request.user or user.is_superuser:
        booking.booking_status = "Cancelled"
        booking.save()
        messages.add_message(request, messages.SUCCESS, 'The booking has been cancelled!')
    else:
        messages.add_message(request, messages.ERROR, 'There was an error cancelling the booking.')
    
    return HttpResponseRedirect(reverse('all-bookings'))

manage-bookings.js

document.addEventListener("DOMContentLoaded", function(){  

  const cancelButtons = document.getElementsByClassName('cancel');

  for (let button of cancelButtons) {
      button.addEventListener("click", (e) => {
      
      // get booking id from dataset of button clicked
      let bookingId = button.dataset.booking_id;
      // insert inner text to cancelled booking button
      button.innerText = "Cancelled!";
      // read current URL
      let currentUrl = window.location.href;
      // remove unused part of URL
      let newUrl = currentUrl.replace('/all-bookings/', '');
      // redirect to cancel booking URL with booking number as argument
      window.location.href = `${newUrl}/cancel_booking/${bookingId}`;

    });
  }
});

Проблема заключается в том, что функция отмены бронирования на странице гостей "Ваши бронирования" работает как ожидалось, а на странице хозяев "Все бронирования" - нет, хотя это один и тот же код.

Для страницы всех бронирований я изменил return HttpResponseRedirect(reverse('your-bookings')) на return HttpResponseRedirect(reverse('all-bookings')) в views. py и let newUrl = currentUrl.replace('/your-bookings/', ''); to let newUrl = currentUrl.replace('/all-bookings/', ''); in manage-bookings.py

Когда я пытаюсь отменить бронирование на странице всех бронирований для хостов, меня перенаправляют с [...]gitpod. io/bookings/all-bookings/ на [...]gitpod.io/bookings/all-bookings/cancel_booking/, что приводит к ошибке Page not found (404). Эта проблема не возникает, когда я отменяю бронирование на странице "Ваши бронирования" для гостей - там страница перенаправляется с [...]gitpod.io/bookings/your-bookings/ на [...]gitpod.io/bookings/your-bookings/ и статус в деталях бронирования меняется с "Requested" на "Cancelled".

Я не могу найти проблему здесь и был бы очень признателен за помощь.

Вернуться на верх