django как получить элемент контекста по имени - PullRequest
0 голосов
/ 08 января 2019

Я рендеринг нескольких таблиц, которые я добавляю в контекст в представлении

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 ]

0 голосов
/ 08 января 2019

Вместо того, чтобы хранить список имен таблиц отдельно от объектов таблицы в контексте, может быть лучше сохранить их более тесно связанными, чтобы упростить работу в шаблоне.

Например, когда вы создаете таблицу, вы можете добавить ее в список 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'] продолжит работать должным образом с sorted() и list.sort() в Python. Но вы можете легко настроить это с помощью функции key , если вам нужно.

Затем в вашем шаблоне вы можете зациклить как имя таблицы, так и саму таблицу без дополнительного поиска:

{% for name, table in all_tables %}
    {% if name %}
        <H3>{{ name }}</H3>
        {% render_table table %}
        <br/>
    {% endif %}
{% endfor %}
0 голосов
/ 08 января 2019

Не ясно, какая связь между x на ваш взгляд и t в вашем шаблоне ... В зависимости от того, как вы построили свои индексы, вы можете попробовать:

{% for x, t in all_tables.items %}
   ...
   {% render_table context.x %}
   ...
{% endfor %}

Или что-то в этом роде.

...