繁体   English   中英

无法在Django DetailView中显示外键相关的object

[英]Can't display foreign key related object in Django DetailView

我有一个与客户和理发师模型相关的预订 class。 我可以使用详细视图显示所有预订,但是,无法弄清楚如何显示特定理发师的预订。 基本上,我想根据给 url 的 ID 获得理发师的一个或多个预订。

这是我的 model:

    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 }}

它将显示所有的理发师。 这是有效的,因为预订和理发师 model 之间的 FK 关系。更多信息可以在Django 文档中找到。 对于反向关系(多对一),请查看此文档

仅供参考,您不需要使用_id创建字段名称后缀,因为 Django 会自动为您创建。

另外,如果你想查询一个理发师,那么你应该在 DetailView 中使用 Barber 作为 model。 然后你可以使用上面提到的类似查询:

# view
class GetBarberBooking(DetailView):
   model = Barber

# template
{{ object.booking_set.all }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM