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

Django中对比字典并标记差异键值对为红色的问题

问题:Django模板中无法为字典差异项标红

我开发了一个Django应用,通过两个文本框展示来自不同函数的字典数据,需求是将两个字典中存在差异的键值对标记为红色(示例中ananas的数值存在差异)。目前已实现字典对比并获取到正确的差异集合,但模板中无法将差异项正确标红。后台打印的diff_set已正确获取到差异项[('ananas', 24), ('ananas', 30)],但模板循环时差异项未被标红。


相关代码

TestFile类代码

class TestFile:
    def __init__(self) -> None:
        pass    
    
    def data_compare2(self):
        fruits2 = {
            "appel": 3962.00,
            "waspeen": 3304.07,
            "ananas": 30,
        }
        set2 = set([(k, v) for k, v in fruits2.items()])
        return set2

    def data_compare(self):
        fruits = {
            "appel": 3962.00,
            "waspeen": 3304.07,
            "ananas": 24,
        }
        set1 = set([(k, v) for k, v in fruits.items()])
        return set1    

    def compare_dic(self):
        set1 = self.data_compare()
        set2 = self.data_compare2()
        diff_set = list(set1 - set2) + list(set2 - set1)
        return diff_set

views.py代码

from .test_file import TestFile

def data_compare(request):
    test_file = TestFile()

    content_excel = ""
    content = ""
    content = test_file.data_compare()
    content_excel = test_file.data_compare2()
    diff_set = test_file.compare_dic()

    context = {"content": content, "content_excel": content_excel, "diff_set": diff_set}

    return render(request, "main/data_compare.html", context)

模板代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="form-outline">
        <div class="form-group">
            <textarea class="inline-txtarea form-control" id="content" cols="10" rows="10">
                    {% for key, value in content %}
                    <span {% if key in diff_set %} style="color: red;" {% endif %}> {{ key }}: {{value}}</span><br>
                    {% endfor %}            
            </textarea>
        </div>
    </div>

    <div class="form-outline">
        <div class="form-group">
            <textarea class="inline-txtarea form-control" id="content.excel" cols="70" rows="25">
                {% for key, value in content_excel %}
                <span {% if key in diff_set %} style="color: red;" {% endif %}>{{ key }}: {{value}}</span><br>
                {% endfor %}            
            </textarea>
        </div>
    </div>
</body>
</html>

解决方案

1. 修正模板判断逻辑

模板中的{% if key in diff_set %}条件错误:diff_set的元素是**(key, value)元组**,不是单个键,所以单个key永远不会匹配到集合中的元素。

将模板中的判断条件修改为检查当前(key, value)元组是否在diff_set中:

<!-- 第一个文本框循环 -->
{% for key, value in content %}
<span {% if (key, value) in diff_set %} style="color: red;" {% endif %}> {{ key }}: {{value}}</span><br>
{% endfor %}

<!-- 第二个文本框循环 -->
{% for key, value in content_excel %}
<span {% if (key, value) in diff_set %} style="color: red;" {% endif %}>{{ key }}: {{value}}</span><br>
{% endfor %}

2. 优化视图层(可选)

将diff_set转为集合类型,提升查找效率:

# views.py中修改diff_set的赋值
diff_set = set(test_file.compare_dic())

3. 解决textarea无法渲染HTML的问题

textarea标签内的HTML标签会被当作纯文本显示,无法渲染样式。需要替换为contenteditable属性的div:

<!-- 替换第一个textarea -->
<div class="inline-txtarea form-control" id="content" cols="10" rows="10" contenteditable="true">
    {% for key, value in content %}
    <span {% if (key, value) in diff_set %} style="color: red;" {% endif %}> {{ key }}: {{value}}</span><br>
    {% endfor %}            
</div>

<!-- 替换第二个textarea -->
<div class="inline-txtarea form-control" id="content_excel" cols="70" rows="25" contenteditable="true">
    {% for key, value in content_excel %}
    <span {% if (key, value) in diff_set %} style="color: red;" {% endif %}>{{ key }}: {{value}}</span><br>
    {% endfor %}            
</div>

内容的提问来源于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.10 12:55:25