使用Django进行动态过滤的详细视图

时间:2019-02-26 21:51:49

标签: django

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

我将为每个房间都有一个详细信息页面(带有通用的DetailView),显示来自房间模型的有关该房间的信息以及与该房间匹配的馆藏模型中的所有记录。第一部分相对容易,但是我不知道如何过滤馆藏并在详细信息页面上显示结果。

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

models.py

server {
    server_name tower.domain.com;
    #reverse proxy settings follow

    location / {
            proxy_set_header X-Real-IP $remote_addr;
            #proxy_set_header Host $http_host;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass https://10.x.x.x/;

    }

views.py

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

rooms_detail.html

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

这给了我{% 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异常值“ room”。我是Django的新手,不知道从哪里可以找到任何建议。

1 个答案:

答案 0 :(得分:1)

除非有充分的理由,否则您不应该为模型指定主键,因为Django随后会自动为您创建一个主键: some_model.id some_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如何知道要检索哪个房间?通过主键-为此,您应该显示urls.py

应该是这样的:

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

您可以通过related_name从一个房间访问馆藏,a_room_instance.holdings_set.all()是在您的情况下自动生成的。您也可以在模板中访问它!

顺便说一句:遵循PEP8编码惯例是一个好习惯-类名(因此,模型)应该在CapWords中。