Django根据表达式设置表格单元格颜色

3 投票
2 回答
6247 浏览
提问于 2025-04-17 13:42

这是关于在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>

撰写回答