Django:django-tables2在DetailView中仅显示一行

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

我正在使用django-tables2在我的数据库中显示信息。 BuildingDetailTable和EnergyTable在同一模板中,并希望它们等同于数据库中一个对象的DetailView。当我在BuildingListView中的BuildingListTable中选择一行时,页面转到正确的building_detail页面,但是BuildingDetailTable和EnergyTable显示数据库中的所有对象,我不知道如何将它们过滤为感兴趣的对象。

我的缩写代码是:

#models.py

class AnnualUse(models.Model):
    elec = models.IntegerField(default=0, verbose_name='Elec kWh')
    gas = models.IntegerField(default=0, verbose_name='Gas ccf')
    wtr = models.IntegerField(default=0, verbose_name='WTR kgal')
    fiscal_year = models.ForeignKey(FiscalYear, on_delete=models.CASCADE)
    building = models.ForeignKey('Building', on_delete=models.CASCADE)

    def __str__(self):
        return '%s %s' % (self.building, self.fiscal_year)

class Building(models.Model):
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False)
    acronym = models.CharField(max_length=3)
    full_name = models.CharField(max_length=200)
    area = models.IntegerField()
    notes = models.TextField(blank=True)
    use_type = models.ForeignKey(UseType, on_delete=models.CASCADE)
    zone = models.ForeignKey(Zone, on_delete=models.CASCADE)

    def __str__(self):
        return self.acronym

    def get_absolute_url(self):
        return reverse('building_detail', args=[str(self.id)])
# tables.py

class BuildingListTable(tables.Table):
    acronym = tables.Column(linkify=True)

    class Meta:
        model = Building
        fields = ('acronym', 'full_name', 'use_type', 'area')

class EnergyTable(tables.Table):
    class Meta:
        model = AnnualUse
        fields = ('fiscal_year', 'elec', 'gas', 'wtr')

class BuildingDetailTable(tables.Table):
    class Meta:
        model = Building
        fields = ('acronym', 'full_name', 'use_type', 'area', 'zone', 'notes')
#views.py
class BuildingListView(SingleTableView):
    model = Building
    table_class = BuildingListTable
    template_name = 'buildings/building_list.html'

class BuildingDetailView(MultiTableMixin, TemplateView):
    template_name = 'buildings/building_detail.html'

    table_pagination = {"per_page": 20}

    def get_tables(self):
        b = Building.objects.all()
        au = AnnualUse.objects.all()
        return [
        BuildingDetailTable(b),
        EnergyTable(au)
        ]
#building_detail.html
{% load django_tables2 %}

    {% for table in tables %}
      {% render_table table %}
    {% endfor %}
django django-tables2
1个回答
0
投票

我认为您可以尝试这样:

# url
path('building/<int:building_id>/<int:annual_id>', BuildingDetailView.as_view())

# view

class BuildingDetailView(MultiTableMixin, TemplateView):
    template_name = 'buildings/building_detail.html'

    table_pagination = {"per_page": 20}

    def get_tables(self):
        b = Building.objects.filter(pk=self.kwargs['building_id'])
        au = AnnualUse.objects.filter(pk=self.kwargs['annual_id'])
        return [
            BuildingDetailTable(b),
            EnergyTable(au)
        ]

这里我将build_idannual_id作为URL参数传递,并在get_tables()方法中使用它们。

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