Как отобразить несколько таблиц в одном представлении, используя django-tables2?
Использование djt2 v0.15 / dj1.6 / pyth2.6.6
djt2 doc Пример файла представлений для нескольких таблиц:
def people_listing(request) :
config = RequestConfig(request)
table1 = PeopleTable(Person.objects.all(), prefix="1-")
table2 = PeopleTable(Person.objects.all(), prefix="2-")
config.configure(table1)
config.configure(table2)
return render(request, "people_listing.html",
{"table1": table1, "table2": table2})
Этот пример, во-первых, кажется неверным в отношении указанных параметров "table1", "table2". Мои тесты показывают, что имя определения people_list необходимо использовать в кавычках, по крайней мере, для одной таблицы. Кроме того, зачем кому-то показывать одну и ту же таблицу дважды? Это плохой пример? Вот мое приложение, пытающееся использовать эту структуру:
def AvLabVw(request):
config = RequestConfig(request)
cmutbl = CmuTable(CmuVersion.objects.all(), prefix="1-")
simtbl = SimTable(Simulator.objects.all(), prefix="2-")
config.configure(cmutbl)
config.configure(simtbl)
return render(request, "AvRelInfo.html", {"AvLabVw":cmutbl, "AvLabVw":simtbl})
Файл url забирает AvLabVw, а HTML-шаблон использует render_table.
{% render_table AvLabVw %}
Что происходит с этим кодом, так это то, что по-прежнему отображается только одна таблица, в зависимости от того, какая из них последняя в строке обратной визуализации.
В другом месте документа говорится, что нужно использовать SingleTableView с get_context_data, чего я еще не выяснил...
У меня есть попытка реализации этого стиля, я думаю, что ему нужен объект таблицы и объект списка?
views.py
из представлений импорта django_tables2 из django_tables2 импортировать SingleTableView из django_tables2 импортировать SingleTableMixin из django.shortcuts импорт рендеринга из django_tables2 import RequestConfig def SimVers_lst(запрос): return render(запрос, 'AvRelInfo.html', {'SimVers_lst': Simulator.objects.all()}) def AvLabVw(запрос): config = RequestConfig(запрос) simlst = SimVers_lst(Simulator.objects.all()) таблица = CmuTable(CmuVersion.objects.all(), префикс ="1-") Stv = views.SingleTableView() multitbl = Stv.get_context_data() config.configure(multitbl) обратный рендер (запрос, "AvRelInfo.html", { "AvLabVw": multitbl })
в {% render_table AvLabVw %}
в HTML шаблон с обычным универсальным"ValueError at /AvCtlapp/ Expected table or queryset, not 'str'."
... получить мусор... Я думаю, я могу попытаться увидеть, что он получает в оболочке, если я могу настроить этот тест...
Спасибо за любую помощь...
Джо
PS: нужен ли пользовательский рендер, и как это будет выглядеть?
1 ответ
Ваш первый пример кода (он был скопирован из документации django-tables2) был предназначен для рендеринга двух таблиц на одной странице. Это неплохой пример (я думаю), потому что он показал, как отобразить 2 таблицы из одного и того же класса таблиц с одинаковым набором запросов с другим префиксом.
И последний пример кода из вашего вопроса, вы ошиблись насчет использования SingleTableView. Он предназначен для рендеринга одной таблицы в шаблоне, а в основном это представление на основе классов. Попробуйте вот так:
class AvLabVw(SingleTableView):
model = Simulator
template_name = 'AvRelInfo.html'
table_class = SimulatorTable
и шаблон как:
{% load render_table from django_tables2 %}
{% render_table table %}
Теперь, если вы хотите визуализировать несколько таблиц, переопределите get_context_data()
метод с этой точки зрения, как это:
class AvLabVw(SingleTableView):
model = Simulator
template_name = 'AvRelInfo.html'
table_class = SimulatorTable
def get_context_data(self, **kwargs):
context = super(AvLabVw, self).get_context_data(**kwargs)
context['table_cmu'] = CmuTable(CmuVersion.objects.all(), prefix="1-")
return context
и шаблон как:
{% load render_table from django_tables2 %}
{% render_table table %}
{% render_table table_cmu %}
и URL:
url(r'^something/$', AvLabVw.as_view(), name='avlabvw'),