Django: Как создать представление пользователя, позволяющее ему изменять или удалять существующие бронирования?

Я разрабатываю службу бронирования ресторанов с помощью Django. Я хочу создать представление для аутентифицированного пользователя, чтобы он мог просматривать только свои существующие заказы. В этом же представлении я хотел бы, чтобы пользователь мог изменить и/или удалить любое из своих бронирований.

На данный момент мне удалось правильно настроить код, чтобы авторизованный пользователь мог видеть только свои бронирования, но на данный момент он не может ничего с ними сделать.

models.py

class Booking(models.Model):

   user = models.ForeignKey(User, on_delete=models.CASCADE)
   table = models.ForeignKey(Table, on_delete=models.CASCADE)
   group_size = models.PositiveIntegerField()
   date = models.DateField(blank=False)
   start_time = models.TimeField(auto_now_add=False, blank=False)
   end_time = models.TimeField(auto_now_add=False, blank=False)
   comment = models.TextField(blank=True)
   created_on = models.DateTimeField(auto_now_add=True)
   approved = models.BooleanField(default=True)

   def __str__(self):
      return f'{self.table}. Booked by {self.user} for {self.group_size} people, for the {self.date} at {self.start_time}. Status {self.approved}'

views.py

class BookingList(TemplateView):

   template_name = 'user_booking.html'

   def get_context_data(self, **kwargs):
      return super().get_context_data(bookings=self.request.user.booking_set.all(), **kwargs)

html_template

{% for booking in user.booking_set.all %}
<h2>{{ booking }}</h2>
{% endfor %}

output

Table 4, WINDOW. Capacity 4 guests. Booked by admin for 4 people, for the 2022-04-30 at 18:00:00. Status True Table 1, OUTSIDE. 
Capacity 2 guests. Booked by admin for 2 people, for the 2022-04-30 at 12:00:00. Status False

Буду благодарен за любой совет или поддержку. Заранее спасибо.

Я добавлю ссылку возле каждого бронирования, чтобы пользователь мог удалить их, ссылка откроет шаблон подтверждения.

Изменяет ваши views.py:

from django.views.generic.edit import DeleteView

class BookingList(TemplateView):
   template_name = 'user_booking.html'

   def get_context_data(self, **kwargs):
      context = super().get_context_data(**kwargs)
      context['bookings'] = self.request.user.booking_set.all()
      return context

class BookingDelete(DeleteView):
   model = Booking
   template_name = 'delete_booking.html'
   success_url ='/'  # Inserts the path used to open BookingList

   def get_queryset(self):
      return self.request.user.booking_set.all()

Отредактируйте свой urls.py:

urlpatterns = [
   # Other url patterns
   path('<pk>/delete/', BookingDelete.as_view(), name='booking_delete'),
]

Добавьте этот шаблон (назовите его delete_booking.html):

<form method="post">{% csrf_token %}
<p>Are you sure you want to delete the booking?</p>
    <input type="submit" value="Confirm">
</form>

Отредактируйте свой user_booking.html шаблон:

{% for booking in bookings %}
<h2>{{ booking }}</h2> <a href="{% url 'booking_delete' pk=booking.pk %}">delete</a><br>
{% endfor %}

Теперь вам следует использовать немного css, чтобы сделать его более приятным для глаз.

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