Как сравнить два словаря и отобразить значения, которые отличаются в шаблоне?
Я пытаюсь сравнить два словаря и если по ключу, значение отличается от другого словаря, то вывести разницу ключ, значение красным цветом.
Я думаю, что мой views.py правильный. Но как показать разницу в шаблоне?
У меня есть файл views.py:
def data_compare():
fruits = {
"appel": 3962.00,
"waspeen": 3304.07,
"ananas": 24,
}
set1 = set([(k, v) for k, v in fruits.items()])
return set1
def data_compare2():
fruits2 = {
"appel": 3962.00,
"waspeen": 3304.07,
"ananas": 30,
}
set2 = set([(k, v) for k, v in fruits2.items()])
return set2
def data_combined(request):
data1 = data_compare()
data2 = data_compare2()
diff_set = list(data1 - data2) + list(data2 - data1)
return render(request, "main/data_compare.html", context={"diff_set": diff_set})
и шаблон:
<!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="container center">
{% for key, value in diff_set.set1.items %}
<span style="color: red;">{{ key }}: {{value}}</span><br>
{% endfor %}
</div>
<div class="container center">
{% for key, value in diff_set.set2.items %}
<span style="color: red;">{{ key }}: {{value}}</span><br>
{% endfor %}
</div>
</body>
</html>
Я сделал print(diff_set) и это показывает:
[('ananas', 24), ('ananas', 30)]
так что это правильно
Но ничего не возвращается.
Вопрос: как вернуть ключ, значение из словаря, который отличается от другого словаря красным цветом?
Looks dictdiff может быть полезен в вашем случае. Следующий пример не совпадает с вашим результатом, но я надеюсь, что он будет полезен.
import dictdiffer
fruits = {
"appel": 3962.00,
"waspeen": 3304.07,
"ananas": 24,
}
fruits2 = {
"appel": 3962.00,
"waspeen": 3304.07,
"ananas": 30,
}
diff = list(dictdiffer.diff(first=fruits, second=fruits2))
print(diff) # [('change', 'ananas', (24, 30))]
Следуя тому же принципу, что и мой последний ответ. Поскольку вы пытаетесь сравнить два словаря с одинаковыми ключами, вы можете просто просмотреть оба словаря сразу, сравнить значения и, если они отличаются, добавить ключ в список условий:
def compare_data(request):
fruits = {"appel": 3962.00,"waspeen": 3304.07,"ananas": 24,}
fruits2 = {"appel": 3962.00,"waspeen": 3304.07,"ananas": 30,}
diff_set = []
for k, v in fruits.items():
if fruits[k] != fruits2[k]:
diff_set.append(k)
context = {
'fruits': fruits,
'fruits2': fruits2,
'diff_set': diff_set,
}
return render(request, 'main/data_compare.html', context)
template.html:
{% extends 'base.html' %}
{% block content %}
<div class="container center">
{% for key, value in fruits.items %}
<span {% if key in diff_set %} style="color: red;" {% endif %}>{{ key }}: {{value}}</span><br>
{% endfor %}
</div>
<div class="container center">
{% for key, value in fruits2.items %}
<span {% if key in diff_set %} style="color: red;"{% endif %}>{{ key }}: {{value}}</span><br>
{% endfor %}
</div>
{% endblock %}
Редактировать
В вашем случае все отображается красным цветом из-за оператора IF:
{% if diff_set %}...{% endif %}
Проверяет, содержит ли переменная 'diff_set' какие-либо значения. Есть, поэтому она возвращает True каждую итерацию.
Для того чтобы использовать вашу структуру 'diff_set':
[('ananas', 24), ('ananas', 30)]
Нужно пройтись по списку и проверить, равно ли первое значение кортежа значению ключа. Даже если вы это сделаете, при текущей структуре это дважды выведет 'ananas' красным цветом.