Невозможно отобразить объект, связанный с внешним ключом, в Django DetailView
У меня есть класс бронирования, который связан с моделями Customer и Barber. Я могу отобразить все бронирования, используя детальное представление, однако, не могу понять, как отобразить бронирование/бронирования, которые есть у конкретного парикмахера. По сути, я хочу получить бронирование или несколько бронирований парикмахера на основе ID, заданного в url.
Вот моя модель:
customer_id = models.ForeignKey(User, on_delete = models.CASCADE,)
barber_id = models.ForeignKey(Barber, on_delete = models.CASCADE)
timeslot = models.DateTimeField('appointment')
def __str__(self):
return f"{self.customer_id} {self.barber_id} {self.timeslot}"
def get_absolute_url(self):
return reverse("model_detail", kwargs={"pk": self.pk})
Мое мнение:
class GetBarberBooking(DetailView):
model = Booking
template_name = "barber_booking.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['barber'] = Booking.objects.filter(
id=self.kwargs.get('<str:pk'))
return context
Мой путь к url:
path('barber-booking/<str:pk>/', views.GetBarberBooking.as_view(), name='barber-booking'),
Вы можете удалить этот кусок кода:
context['barber'] = Booking.objects.filter(
id=self.kwargs.get('<str:pk'))
А в шаблоне просто используйте:
{{ object.barber_id }}
И показать все бронирования для парикмахера:
{{ object.barber_id.booking_set.all }}
В результате будут показаны все парикмахеры. Это работает благодаря FK-отношению между моделями Booking и Barber. Более подробную информацию можно найти в документации Django. Для обратного отношения (многие к одному), пожалуйста, ознакомьтесь с этой документацией.
К вашему сведению, вам не нужно создавать суффикс имени поля с _id
, потому что Django создает его автоматически за вас.
Также, если вы хотите запросить Barber, то вам следует использовать Barber в качестве модели в DetailView. Затем вы можете использовать аналогичный запрос, упомянутый выше:
# view
class GetBarberBooking(DetailView):
model = Barber
# template
{{ object.booking_set.all }}