在详细视图中使用Django的动态过滤器

在详细视图中使用Django的动态过滤器,django,Django,我有两个模型:房间和藏品。Rooms是一个房间列表,holdings是存储在这些房间中的物品列表 我希望有一个详细页面,包含每个房间的通用详细视图,显示房间模型中关于该房间的一些信息以及控股模型中与该房间匹配的所有记录。第一部分相对简单,但我不知道如何筛选持股并在详细信息页面上显示结果 以下是我目前掌握的情况: models.py views.py rooms\u detail.html 对于self.room=get\u object\u或\u 404rooms,room=self.kwarg

我有两个模型:房间和藏品。Rooms是一个房间列表,holdings是存储在这些房间中的物品列表

我希望有一个详细页面,包含每个房间的通用详细视图,显示房间模型中关于该房间的一些信息以及控股模型中与该房间匹配的所有记录。第一部分相对简单,但我不知道如何筛选持股并在详细信息页面上显示结果

以下是我目前掌握的情况:

models.py

views.py

rooms\u detail.html


对于self.room=get\u object\u或\u 404rooms,room=self.kwargs['room'],这给了我一个异常值为'room'的KeyError。我是Django的新手,不知道从这里走到哪里,任何建议都值得赞赏。

除非您有充分的理由,否则不应该为模型指定主键,因为Django会自动为您创建一个主键:some_model.id。某些_model.pk始终指向主键,而不管其名称如何。在房间模型中,room.pk是room.room的同义词

在详图视图中执行的每个替代都是不必要的:

class RoomDetailView(generic.DetailView):
    model = rooms
    template_name = 'rooms_detail.html'
    context_object_name = 'room'  # to access the room via  {{ room }} in the
                                  # template and not the generic {{ object }}
DetailView如何知道要检索哪个房间?通过主键-为此,您应该显示您的URL.py

应该是这样的:

# ...
path('rooms/<str:pk>', views.RoomDetailView.as_view(), name='room-detail'),
# ...
您可以通过相关的_名称从文件室访问控股,该名称在您的案例中自动生成:a_room_instance.holdings_set.all。你也可以在模板中访问它


顺便说一句:遵循PEP8编码约定是一个很好的做法-类名因此模型应该是大写的。

我应该把一个_room\u instance.holdings\u set.all放在哪里?我如何在模板中访问它?这只是一个示例。在RoomDetailView中,您可以通过{%forholding In room.holdings_set.all%}{{holding}}{%endfor%}来迭代这个房间的持有量。这很好,这个例子对我有很大帮助。谢谢比这简单多了。
{% extends "base_generic.html" %}

{% block content %}
  <h3>Room Detail </h3>
  <p></p>
  <p><strong>Room: </strong>{{ rooms.room }}</p>
  <p><strong>Location:</strong> {{ rooms.location }}</p>

{% endblock %}  
class RoomDetailView(generic.DetailView):
    model = rooms
    template_name = 'rooms_detail.html'
    context_object_name = 'room'  # to access the room via  {{ room }} in the
                                  # template and not the generic {{ object }}
# ...
path('rooms/<str:pk>', views.RoomDetailView.as_view(), name='room-detail'),
# ...