Django模板中带有变量键的括号表示法不起作用

a0zr77ik  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(136)

我试图动态呈现一个基于表模型和它的列的表。在模板中,我循环遍历查询集中的每个项,然后遍历硬编码列名列表中的每个列,但Django返回Could not parse the remainder: '[column]' from 'table[column]'错误。table.id呈现正确的id值,但table[column[0]]返回错误。Django不允许用括号表示变量吗?
在这个例子中,table是模型类的dict,columns是模型的列名列表。

<tbody>
            {% for table in query_set %}
            <tr>
                {% for column in columns %}
                    <td>{{table[column]}}</td>
                {% endfor %}
            </tr>
            {% endfor %}
        </tbody>

我还尝试在表dict上使用.items方法:

<tbody>
            {% for table in query_set %}
            <tr>
                {% for key, value in table.items %}
                    <td>{{value}}</td>
                {% endfor %}
            </tr>
            {% endfor %}
        </tbody>

但这并不能说明什么表.items似乎是未定义的。
相应的视图:

def index(request):
    cur_user = request.user
    Model = get_model(query.table)
    columns = get_table_columns(query.table)

    #
    # code for processing raw SQL query here
    #

    query_set = Model.objects.raw(query_string)

    context = {
        'columns': columns,
        'cur_user': cur_user,
        'query_set': query_set
    }
    return render(request, 'flight_deck/index.html', context)
huus2vyu

huus2vyu1#

Django的模板语言不支持下标(即``x[y]),这是为了防止人们在模板中编写 * 业务逻辑 *。可以使用Jinja作为模板语言,但这不是必要的,而且在某种程度上会产生反作用,这恰恰是为了防止在模板中编写业务逻辑。
因此,更有意义的做法是“准备”数据,以便以更易于访问的格式将其传递给模板,例如:

def index(request):
    Model = get_model(query.table)
    columns = get_table_columns(query.table)

    #
    # code for processing raw SQL query here
    #

    queryset = Model.objects.raw(query_string)
    data = [[getattr(row, column) for column in columns] for row in queryset]

    context = {'columns': columns, 'data': data}
    return render(request, 'flight_deck/index.html', context)

并将其渲染为:

{% for row in data %}
<tr>
    {% for cell in row %}
        <td>{{ cell }}</td>
    {% endfor %}
</tr>
{% endfor %}

注意:不需要将当前用户传入模板,如果您使用**render(…)**[Django-doc]设置请求,则请求在模板中是可访问的,因此您可以使用{{ request.user }}
注意:使用原始查询往往不是一个好主意:必须小心SQL注入,但可能更重要的是:它不允许对查询集进行进一步的后处理,如排序、分页等。在数据库级别。

相关问题