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".
Я не могу найти проблему здесь и был бы очень признателен за помощь.