Объединить DetailView и SingleTableView в Django

#django #django-views #django-tables2

#django #django-просмотры #django-tables2

Вопрос:

Как я могу отобразить таблицу SingleTableView вместе с DetailView в django? Я хочу включить или объединить оба в один. Так что при вызове DeviceDetailView я получаю сведения об устройстве и таблицу данных устройств (хранящихся также в другой модели).

Я использую django-tables2 для таблицы.

У кого-нибудь есть идеи?

Спасибо

 class DataListView(SingleTableView):
    model = Data
    template_name = 'data/list.html'
    table_class = DataTable

    def post(self, request, *args, **kwargs):

        queryset = request.POST

        for i in queryset['list'].split(","):

            if queryset['action'] == 'delete':
                Data.objects.filter(data_id=i).delete()


        return HttpResponseRedirect('/data/')


class DeviceDetailView(DetailView):
    template_name = 'devices/detail.html'

    def get_object(self):
        id_ = self.kwargs.get("id")
        return get_object_or_404(Device, id=id_)
 

Редактировать
Я знаю, что это должно выглядеть примерно так:

 class DeviceDetailView(SingleTableView, DetailView):
    template_name = "devices/device-detail.html"
    model = Device
    table_class = DeviceTable

    def get_context_data(self, **kwargs):
        self.object = self.get_object()
        context = super(DetailView, self).get_context_data(**kwargs)
        id_ = self.kwargs.get("id")
        obj = Device.objects.filter(id=id_)
        context['object'] = obj
        return context
 

Но я думаю, что я все еще не знаю, как сделать эту часть внутри get_context_data, чтобы элементы были объединены вместе…

РЕШЕНИЕ

Хорошо, это похоже на это:

 class DeviceDetailView(SingleTableView, DetailView):
    template_name = 'devices/device-detail.html'
    model = Data
    table_class = DataTable
    #crumbs = [('Device detail', 'DeviceDetailView')]

    def get_context_data(self, **kwargs):
        self.object = self.get_object()
        context = super(DetailView, self).get_context_data(**kwargs)
        table = self.get_table(**self.get_table_kwargs())
        context[self.get_context_table_name(table)] = table
        return context

    def get_object(self):
        id_ = self.kwargs.get("id")
        return get_object_or_404(Device, id=id_)
 

Ответ №1:

Вы можете обслуживать таблицу в рамках вашего DetailsView пользовательского get_context_data интерфейса. Вы можете отобразить свою таблицу в шаблоне, как вы обычно это делаете {% render_table table %} .

 # import YourModel
# import YourTable

class DeviceDetailView(DetailView):
    model = YourModel
    template_name = 'devices/detail.html'

    def get_context_data(self, **kwargs):
        table = YourTable(YourModel.objects.all()) # define your tables data here
        context = {"table": table}
        return super().get_context_data(**context)
 

Комментарии:

1. Спасибо, Марко, за ответ, но куда я поместил класс SingleTableView?

2. Поскольку вы хотите предоставить оба (detail и table) в одном представлении, нет необходимости определять два представления. Либо объединить таблицу в DetailView (упомянутое решение), либо отправить подробные данные в SingleTableView.