我试图动态呈现一个基于表模型和它的列的表。在模板中,我循环遍历查询集中的每个项,然后遍历硬编码列名列表中的每个列,但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)
1条答案
按热度按时间huus2vyu1#
Django的模板语言不支持下标(即``x
[
y]
),这是为了防止人们在模板中编写 * 业务逻辑 *。可以使用Jinja作为模板语言,但这不是必要的,而且在某种程度上会产生反作用,这恰恰是为了防止在模板中编写业务逻辑。因此,更有意义的做法是“准备”数据,以便以更易于访问的格式将其传递给模板,例如:
并将其渲染为:
注意:不需要将当前用户传入模板,如果您使用**
render(…)
**[Django-doc]设置请求,则请求在模板中是可访问的,因此您可以使用{{ request.user }}
。注意:使用原始查询往往不是一个好主意:必须小心SQL注入,但可能更重要的是:它不允许对查询集进行进一步的后处理,如排序、分页等。在数据库级别。