Django: django -tables2 Показать только одну строку в DetailView - PullRequest
0 голосов
/ 14 апреля 2020

Я использую django -tables2 для отображения информации в моей базе данных. BuildingDetailTable и EnergyTable находятся в одном шаблоне и хотят, чтобы они были эквивалентом DetailView одного объекта в моей базе данных. В тот момент, когда я выбираю строку в BuildingListTable в моем BuildingListView, страница переходит на правильную страницу 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 %}

1 Ответ

0 голосов
/ 14 апреля 2020

Я думаю, вы можете попробовать вот так:

# 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_id и annual_id в качестве аргументов url и использую их в методе get_tables().

...