#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.