You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何将两个列表的差异值标记为红色?

解决Django模板中标记表格差异值为红色的问题

核心问题在于你用tabulate生成的是完整的HTML字符串,经过mark_safe后模板会直接渲染成表格,没法再对单个单元格做循环判断——模板根本看不到表格里的具体数值,自然没法标记差异。下面给你三种可行的解决思路:

方案一:放弃tabulate,用Django模板手动渲染表格

把PDF、Excel的数值列表和差异集合直接传到模板,自己写表格结构,逐个单元格判断是否属于差异值:

视图代码示例

def your_view(request):
    # 假设你已经拿到这些数据
    data_pdf = [100, 5018.75, 200, 3588.2]
    data_excel = [100, 5018.4, 200, 3588.1]
    diff_set = {5018.75, 3588.2, 3588.1, 5018.4}
    
    # 提前打包成元组列表,避免模板用zip过滤器
    table_rows = list(zip(data_pdf, data_excel))
    
    return render(request, 'your_template.html', {
        'table_rows': table_rows,
        'diff_set': diff_set
    })

模板代码示例

<table border="1">
    <thead>
        <tr>
            <th>PDF数值</th>
            <th>Excel数值</th>
        </tr>
    </thead>
    <tbody>
        {% for pdf_val, excel_val in table_rows %}
        <tr>
            <td {% if pdf_val in diff_set %}style="color: red;"{% endif %}>{{ pdf_val }}</td>
            <td {% if excel_val in diff_set %}style="color: red;"{% endif %}>{{ excel_val }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

方案二:在tabulate生成HTML时直接嵌入样式

不用改模板,在后端生成tabulate表格时,自定义格式化函数,给差异值加上红色样式:

视图代码示例

from tabulate import tabulate
from django.utils.safestring import mark_safe

def your_view(request):
    data_pdf = [100, 5018.75, 200, 3588.2]
    data_excel = [100, 5018.4, 200, 3588.1]
    diff_set = {5018.75, 3588.2, 3588.1, 5018.4}
    
    # 自定义格式化函数
    def format_diff(val):
        if val in diff_set:
            return f'<span style="color: red;">{val}</span>'
        return str(val)
    
    # 构造表格数据,每行对应PDF和Excel的数值
    table_data = list(zip(data_pdf, data_excel))
    # 生成带样式的HTML表格
    html_table = tabulate(
        table_data,
        headers=["PDF数值", "Excel数值"],
        tablefmt="html",
        formatters=[format_diff, format_diff]  # 对两列都应用格式化函数
    )
    
    return render(request, 'your_template.html', {
        'content_table': mark_safe(html_table)
    })

模板代码示例

{{ content_table }}

这种方式直接在后端生成带红色样式的HTML,模板只需要直接渲染即可,不用做任何判断。

方案三:前端JavaScript处理差异标记

如果不想改后端逻辑,也可以在页面加载完成后,用JS遍历表格单元格,给差异值加样式:

视图代码示例

import json
from tabulate import tabulate
from django.utils.safestring import mark_safe

def your_view(request):
    data_pdf = [100, 5018.75, 200, 3588.2]
    data_excel = [100, 5018.4, 200, 3588.1]
    diff_set = {5018.75, 3588.2, 3588.1, 5018.4}
    
    table_data = list(zip(data_pdf, data_excel))
    html_table = tabulate(table_data, headers=["PDF数值", "Excel数值"], tablefmt="html")
    
    return render(request, 'your_template.html', {
        'content_table': mark_safe(html_table),
        'diff_json': json.dumps(list(diff_set))
    })

模板代码示例

{{ content_table }}

<script>
window.addEventListener('load', function() {
    const diffValues = JSON.parse('{{ diff_json|escapejs }}');
    // 获取所有表格单元格
    const cells = document.querySelectorAll('table td');
    cells.forEach(cell => {
        const cellValue = parseFloat(cell.textContent);
        // 处理浮点精度问题,用极小值判断
        if (diffValues.some(val => Math.abs(val - cellValue) < 0.0001)) {
            cell.style.color = 'red';
        }
    });
});
</script>

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:55:38