Django如何通过名称获取上下文项

时间:2019-01-08 06:47:49

标签: django django-tables2

我正在渲染一些表,这些表将添加到视图的上下文中

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 :(得分:3)

与其将表名列表与上下文中的表对象分开,不如让它们更紧密地关联在一起,以使模板中的事情变得更容易。

例如,创建表时,可以使用元组将其及其名称添加到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()的{​​{1}}中的元组列表进行排序将继续正常工作。但是,如果需要,您可以使用key函数轻松地对其进行自定义。

然后,您可以在模板中遍历表名和表本身,而无需任何额外的查找:

list.sort()

答案 1 :(得分:1)

目前尚不清楚您视图中的x与模板中的t之间的链接是什么... 根据建立索引的方式,您可以尝试:

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

或者那样。