django как получить элемент контекста по имени
Я рендеринг нескольких таблиц, которые я добавляю в контекст в представлении
from .models import MyModel
from .tables import MyModelTable
def index(request):
context = dict(all_tables=[])
template = 'mypage/index.html'
for x in some_list:
if some_condition(x):
context[x] = MyModelTable(get_some_data(x))
context['all_tables'].append(x)
context['all_tables'] = sort_my_way(context['all_tables'])
return render(request, template, context)
А потом я пытаюсь перебрать список и создать таблицы по одной. Однако я не могу понять, как получить таблицу из контекста, используя имя строки.
index.html
{% load django_tables2 %}
{% load render_table from django_tables2 %}
<!doctype html>
<html>
<link rel="stylesheet" href="{% static 'css/my.css' %}" />
<body>
{% for t in all_tables %}
{% if t %}
<H3>{{ t }}</H3>
{% render_table t %} <--- How can I get the table with name t from context
<br/>
{% endif %}
{% endfor %}
</body>
То, что я пытаюсь сделать здесь, это избавить себя от огромного списка тех, кто находится здесь в моем index.html
{% if TABLE_1 %}
<H3>TABLE_1 </H3>
{% render_table TABLE_1 %}
<br/>
{% endif %}
....
{% if TABLE_N %}
<H3>TABLE_N </H3>
{% render_table TABLE_N %}
<br/>
{% endif %}
2 ответа
Вместо того, чтобы хранить список имен таблиц отдельно от объектов таблицы в контексте, может быть лучше сохранить их более тесно связанными, чтобы упростить работу в шаблоне.
Например, когда вы создаете таблицу, вы можете добавить ее в all_tables
список вместе с его именем, используя кортеж:
for x in some_list:
if some_condition(x):
named_table = (x, MyModelTable(get_some_data(x)))
context['all_tables'].append(named_table)
Вы не показали sort_my_way()
но сортировка списка кортежей в context['all_tables']
будет продолжать работать как положено с Python sorted()
а также list.sort()
, Но вы можете легко настроить это с помощью ключевой функции, если вам нужно.
Затем в вашем шаблоне вы можете зациклить как имя таблицы, так и саму таблицу без дополнительного поиска:
{% for name, table in all_tables %}
{% if name %}
<H3>{{ name }}</H3>
{% render_table table %}
<br/>
{% endif %}
{% endfor %}
Не ясно, какая связь между x
по вашему мнению и t
в вашем шаблоне... В зависимости от того, как вы создали свои индексы, вы можете попробовать:
{% for x, t in all_tables.items %}
...
{% render_table context.x %}
...
{% endfor %}
Или что-то в этом роде.