我正在try 基于表模型及其列动态呈现一个表.在模板中,我遍历qeuryset中的每一项,然后遍历硬编码列名列表中的每一列,但Django返回Could not parse the remainder: '[column]' from 'table[column]'错误.table.id呈现正确的id值,但table[column[0]]返回错误.Django不允许变量使用方括号表示法吗?

在本例中,TABLE是模型类的词典,COLUMNS是模型的列名列表.

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

我还try 在表DICT上使用.Items方法:

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

但这不会产生任何影响.Table.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)

推荐答案

Django的模板语言not支持订阅(即x[y]),这是为了防止人们在模板中编写business logic.可以使用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 %}

Note:不需要将当前用户传入模板,如果SET请求使用render(…) [Django-doc],则可以在模板中访问该请求,因此可以使用{{ request.user }}.


Note:使用原始查询通常不是一个好主意:必须小心SQL注入,但可能更重要的是:它不允许在数据库级别对查询集进行进一步的后处理,如排序、分页等.

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

如何根据递归ManyToManyField值创建Django查询集?

Django mods.py我想要一个函数转到一个变量

使用自定义模型注册后,Django无法登录

情节主题更改问题

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

dj_rest_auth 中的 PyTest 警告- RemovedInDjango40Warning: django.conf.urls.url() 已弃用,取而代之的是 django.urls.re_path()

表单集中的每个表单验证

如何在Django中制作一个不 Select 以前日期的日期 Select 器

在Django Rest Framework中按模型属性排序时如何避免重新计算?

在 Django 中处理信用卡付款的最佳 Select 是什么?

获取结果集中返回的元素数的 django 模板标签是什么?

django - 让用户登录到测试客户端

如何缓存 Django Rest Framework API 调用?

Django:将原始html(来自数据库)显示为html,而不是呈现

在 Django 中注册用户的最佳方法

如何覆盖 django 管理员翻译?

import_module 的 Django 1.9 ImportError

用于创建和更新的基于 Django 类的视图

Django - TypeError - save() 得到了一个意外的关键字参数force_insert