在 DetailView 中显示多个对象

bry*_*bee 4 python django django-views

我最近一直在涉足 Django CBV 并有一个问题。也许你有比我更好的想法。

假设我有一个航空公司预订 CRM 应用程序,我打算为各种事情执行客户的显示。假设我有一个列表Models,对于一个CustomerBookingRatingCustomer_Service_CallsFavourited_Route

现在,鉴于DetailView由 Django 的 CBV 实现,我有这样的东西

class CustomerThreeSixtyView(DetailView):
  model = 'Customer'

  def get_context_data(self, **kwargs):
      context = super(CustomerThreeSixtyView, self).get_context_data(**kwargs)
      context['bookings'] = Booking.objects.all.filter(customer_id=request.kwargs['pk']
      context['ratings'] = Ratings.objects.all.filter(customer_id=request.kwargs['pk']
      context['calls'] = Customer_Service_Calls.objects.all.filter(customer_id=request.kwargs['pk'], status'Open')
      context['fav_routes'] = Favourited_Route.objects.all.filter(customer_id=request.kwargs['pk'], status'Open')
      return context
Run Code Online (Sandbox Code Playgroud)

像这样的东西。我的问题是,有没有更好的方法来做到这一点?这是最直接的方法,但我正在寻求建议,因为似乎有些事情是必然的。

AKS*_*AKS 5

你所做的看起来已经足够好了。您将获得上下文中所需的内容,然后在模板中使用它来显示信息。

或者,您可以直接访问模板中特定客户的预订,而无需在上下文中指定它:

{% for booking in object.booking_set.all %} # object is the customer here
     # do what you want to do with the booking here
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

如果您related_name在将客户链接到 Booking 时使用,那就更好了:

class Booking(models.Model):
    customer = models.ForeignKey(Customer, related_name='bookings')
    # other fields
Run Code Online (Sandbox Code Playgroud)

现在,您可以直接使用定义related_name来访问特定客户的预订:

{% for booking in object.bookings.all %}
     # do what you want to do with the booking here
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

而且,你可以使用其他类,如同样的方法RatingCustomer_Service_CallsFavourited_Route等。