动态过滤器与Django详细视图中

问题描述 投票:0回答:1

我有两个模型:房间和馆藏。房间是房间列表,馆藏是这些房间中存储的东西的列表。

我希望每个房间都有一个详细页面(带有通用的DetailView),显示房间模型中有关该房间的一些信息以及与该房间匹配的馆藏模型中的所有记录。第一部分相对容易,但我无法弄清楚如何过滤馆藏并在详细页面上显示结果。

这是我到目前为止所拥有的:

models.朋友

class rooms(models.Model):
    room = models.CharField(primary_key=True, max_length=100, help_text='Room/storage area ID')
    location = models.CharField(max_length=100, help_text='Location', null=True)

    def __str__(self):
        return self.room

    def get_absolute_url(self):
        return reverse('room-detail', args=[str(self.room)])

class holdings(models.Model):
    id = models.IntegerField(primary_key=True)
    room = models.ForeignKey('rooms', on_delete=models.SET_NULL, null=True)
    contact = models.CharField(max_length=100, help_text='Contact', null=True)
    survey = models.ForeignKey('surveys', help_text='Survey ID, Cruise ID, FACS ID, or FAN', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return f'{self.room}, {self.contact}, {self.survey}'      

views.朋友

class RoomDetailView(generic.DetailView):
model = rooms

def get_queryset(self):
    self.room = get_object_or_404(rooms, room=self.kwargs['room'])
    return holdings.objects.filter(room=self.room)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['room'] = self.room
    return context

rooms_detail.html

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

这给了我一个KeyError,行self.room = get_object_or_404(rooms, room=self.kwargs['room'])的异常值'room'。我是Django的新手,无法弄清楚从哪里开始,任何建议都值得赞赏。

django
1个回答
1
投票

除非你有充分的理由,否则你不应该为模型指定主键,因为Django会自动为你创建一个主键:some_model.id。 some_model.pk始终指向主键,无论其名称如何。在你的房间模型中,room.pkroom.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如何知道要检索哪个房间?通过主键 - 你应该显示你的urls.py

它应该是这样的:

# ...
path('rooms/<str:pk>', views.RoomDetailView.as_view(), name='room-detail'),
# ...

您可以通过related_name从房间访问馆藏,a_room_instance.holdings_set.all()会根据您的情况自动生成:qazxswpoi。您也可以在模板中访问它!

顺便说一下:遵循PEP8编码约定是一种好习惯 - 类名(因此模型)应该在CapWords中。

© www.soinside.com 2019 - 2024. All rights reserved.