程序需要渲染一个表格,有两种思路:
1 python直接生成html标签传给模板
2 利用django的模板语言
坑一 模板传参
一开始考虑直接用python生成html代码,然后通过给模板传参的方式传递过去:
html='<tr> '
tr_count =0;
for k,v in record.items():
if tr_count==2:
html = html + '</tr><tr>'
tr_count=0
if v != None:
html=html +"<td>" + k +":"+ str(v) +"</td>"
tr_count+=1
if html[-4:] == '<tr>':
html = html[:-4]
else:
html = html+'</tr>'
html = """
<table style="width: 100%">
<tbody>
{}
</tbody>
</table>
""".format(html)
return render(request, 'system/gis/devicedetail.html',context={'html':html})
结果发现传递给模板的内容带了双引号,浏览器解析成了字符串。
坑二: django模板语言
既然直接传参不行,那就用django的模板语言吧,结果还是被狠狠坑了一把,
下面代码是生成2列的一个table, data是一个字典,字典value[0]==0表示开始新行
data= {'a':[0,11],'b':[1,22],'c':[0,33],'d':[1,44],'e':[0,55],'f':[1,66]}
<table style="width: 100%" border="1">
<tbody>
{% for k,v in data.items %}
{% if v.0 == 0 %}
<tr>
{% endif %}
<td>{{ k }}:{{ v.1 }}</td>
{% if v.0 == 0 %}
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
按照我的理解,如果v.0==0 自动加tr和tr的结束标签,正常人都会这么干吧,可是反复测试都得不到预期的结果。 最后发现只需要加tr标签就行, 结束标签django会自动去加的
改成下面的代码测试正常。
<table style="width: 100%" border="1">
<tbody>
{% for k,v in data.items %}
{% if v.0 == 0 %}
<tr>
{% endif %}
<td>{{ k }}:{{ v.1 }}</td>
{% endfor %}
</tbody>
</table>