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, чтобы сделать его более приятным для глаз.