django 如何按名称获取上下文项

django how to get context item by name

我正在渲染一些 table,我将它们添加到视图的上下文中

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)

然后我尝试遍历列表并逐一创建 table。但是,我不知道如何使用字符串名称从上下文中获取 table。

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 %}

不清楚您视图中的 x 和模板中的 t 之间的 link 是什么... 根据您构建索引的方式,您可以尝试:

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

或者诸如此类。

与其将 table 名称列表与上下文中的 table 对象分开,不如让它们更紧密地关联起来,这样模板中的事情就更容易了。

例如,当您创建 table 时,您可以使用元组将其连同其名称一起添加到 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() 和 [=16] =].但如果需要,您可以使用 key 函数轻松自定义它。

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

{% for name, table in all_tables %}
    {% if name %}
        <H3>{{ name }}</H3>
        {% render_table table %}
        <br/>
    {% endif %}
{% endfor %}