Django根据表达式设置表格单元格颜色
这是关于在Redhat 6.3上使用Django 1.3.1和Python 2.6的内容。
在Django中,我想根据表格单元格的值来改变背景颜色,比如如果值大于10就变红,7到9之间变橙色,低于7则变绿色等等。
这些数据来自一个非Django的数据库或模型。
我正在使用一个标准模板来遍历这个表格,但如果需要,我也可以使用自定义模板。
我看到有一个链接:
这个链接讨论了如何改变单元格颜色,但似乎是基于单元格中的具体值,而不是一个范围。
我在视图中使用了以下测试代码:
def dashboard(request):
if request.user.is_authenticated():
user = request.user.first_name
else:
return redirect('/bcpm/login')
table_headers = ['Colmun1','Column2','Column3']
table_data = [['test1',2,3],['test2',2,4],['test3',5,5]]
page_title = 'Dashboard'
template_dict = {'header_list':table_headers, 'page_title':page_title,
'results':table_data,'username':user}
return render_to_response('dashboard.html',template_dict)enter code here
还有以下通用表格模板:
<table border=1 width=98% style="margin-left:12px;">
<tr>
{% for item in header_list %}
<th>{{ item }}</th>
{% endfor %}
</tr>
{% for row in results %}
<tr>
{% for line in row %}
<td>{{line}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
谢谢。
几乎解决了;
在brianbuck的帮助下,我在视图中得到了以下代码:
def dashboard(request):
if request.user.is_authenticated():
user = request.user.first_name
else:
return redirect('/login'
table_headers = ['Column1','Column2','Column3']
table_data = [['name','thing',8],['name','thing',5]]
page_title = 'Dashboard'
template_dict = {'header_list':table_headers, 'page_title':page_title,
'results':table_data,'username':user}
return render_to_response('dashboard.html',template_dict)
在模板中:
<table border=1 width=68% style="margin-left:12px;">
<tr>
{% for item in header_list %}
<th>{{ item }}</th>
{% endfor %}
</tr>
{% for element in results %}
<tr>
<td> {{ element.0 }} </td>
<td> {{ element.1 }} </td>
{% if element.3 > 7 %} <td class="red"> {{ element.3 }} </td>
{% else %} <td class="green"> {{ element.3 }} </td> {% endif %}
</tr>
{% endfor %}
</table>
{% endif %}
我真的无法让它执行一个{% if 或 %}的判断。
当我尝试设置条件为
“大于等于7或小于等于8”
时,它总是会对大于7的数字返回这个表达式,即使第一个if语句应该对大于9的任何数字都为真。
我使用的是Django 1.3,我觉得在if/else和多个条件判断上可能有一些限制,不过我现在已经有80%的功能可以用,红色和绿色的判断也足够用了。
谢谢大家。
我让它像这样工作了;
{% for element in results %}
<tr>
<td> {{ element.0 }} </td>
<td> {{ element.1 }} </td>
<td> {{ element.2 }} </td>
<td> {{ element.3 }} </td>
{% if element.4 > 8 %} <td class="red"> {{ element.4 }} </td>
{% else %}{% if element.4 > 8 or element.4 >= 5 %} <td class="orange"> {{ element.4 }} </td>
{%else %}{% if element.4 < 5 %}<td class="green"> {{ element.4 }} </td>
{% endif %}{% endif %}{% endif %}
<td> {{ element.5 }} </td>
如果你有支持elif的Django版本,或者添加了一些可用的Django代码片段来扩展你的Django安装,这一步就不需要了。
太好了。
2 个回答
0
我想只在admin.py文件里做到这一点。
- 假设你的列叫做
col
: - 如果这个列的值大于0,就把它的颜色设置为绿色;如果小于或等于0,就把它的颜色设置为红色。
def TableAdmin(admin.ModelAdmin)
def col_(self, obj):
green_style = "<script>document.querySelectorAll('.green_table_elem').forEach(elem => { elem.parentElement.style.background = 'green'; })</script>"
red_style = "<script>document.querySelectorAll('.red_table_elem').forEach(elem => { elem.parentElement.style.background = 'red'; })</script>"
if obj.col > 0:
return mark_safe(f'<div class="green_table_elem">{obj.col}</div> {green_style}')
else:
return mark_safe(f'<div class="red_table_elem">{obj.col}</div> {red_style}')
list_display = ('col_',)
这样做是给 td
(列)本身上色,而不是像一些回答那样给添加的div上色。
4
这里假设你有三个类,名字分别是:
td.red {
backgroundColor: red;
}
td.orange {
backgroundColor: orange;
}
td.green {
backgroundColor: green;
}
...
Django 1.3 这个版本没有 elif
这个功能,所以你可能需要用一种比较笨拙的方式来实现。
<td class="
{% if val >= 10 %}red{% endif %}
{% if val >= 7 or val <= 9 %}orange{% endif %}
{% if val < 7 %}green{% endif %}">
{{ val }}
</td>