Сравнение двух списков друг с другом и выделение разницы цветом с помощью django
У меня есть приложение django. И я пытаюсь в шаблоне пометить красным цветом значения различий в списках.
У меня есть несколько методов со списками внутри. Потому что в реальной ситуации. Вы можете загрузить pdf и excel файл. Но это только для тестирования. Чтобы я мог использовать это в реальной ситуации. Но идея та же самая.
Так вот методы:
from django.utils.safestring import mark_safe
from tabulate import tabulate
class FilterText:
def total_cost_fruit(self):
return [3588.20, 5018.75, 3488.16]
def show_extracted_data_from_file(self):
regexes = [self.total_cost_fruit()]
matches = [(regex) for regex in regexes]
columns = ["kosten fruit"]
return mark_safe(
tabulate(
zip_longest(*matches), # type: ignore
headers=columns,
tablefmt="html",
stralign="center",
)
)
и второй класс:
from django.utils.safestring import mark_safe
from tabulate import tabulate
class ExtractingTextFromExcel:
def init(self):
pass
def extract_data_excel_combined(self):
new_fruit_list = [[i] for i in self.total_fruit_cost()]
columns = ["totaal", "kosten", "fruit"]
return mark_safe(tabulate(new_fruit_list, headers=columns, tablefmt="html", stralign="center"))
def total_fruit_cost(self):
dict_fruit = {"Watermeloen": 3588.10, "Appel": 5018.40, "Sinaasappel": 3488.16}
fruit_list = list(dict_fruit.values()) #[[i] for i in dict_fruit.values()]
print(fruit_list)
return fruit_list
и views.py:
def test(request):
filter_excel = ExtractingTextFromExcel()
filter_text = FilterText()
compare_data = CompareData()
total_fruit_cost_pdf = filter_text.total_cost_fruit()
total_fruit_cost_excel = filter_excel.total_fruit_cost()
diff_set = compare_data.diff(total_fruit_cost_pdf, total_fruit_cost_excel)
print(diff_set)
content_excel = ""
content_pdf = ""
content_pdf = filter_text.show_extracted_data_from_file()
content_excel = filter_excel.extract_data_excel_combined()
context = {
"content_pdf": content_pdf,
"content_excel": content_excel,
"diff_set": diff_set,
}
return render(request, "main/test.html", context)
и шаблон:
Если я сделаю оператор print в методе views.py. Тогда я вижу правильные различия:
{5018.75, 3588.2, 3588.1, 5018.4}
Но в шаблоне ничего не видно.
Вопрос: как отметить различные значения красным цветом?
если вы сделаете в шаблоне:
<div class="wishlist">
{{content_pdf}}
</div>
<div class="wishlist">
{{content_excel}}
</div>
Тогда это выглядит так:
kosten fruit totaal
3588.2 3588.1
5018.75 5018.4
3488.16 3488.16
и поэтому 3588.2, 3588.1 должны быть окрашены в красный цвет, а 5018.75, 5018.4 должны быть окрашены в красный цвет.
если я сделаю print(content_pdf)
вот вывод:
<table>
<thead>
<tr><th style="text-align: right;"> kosten fruit</th></tr>
</thead>
<tbody>
<tr><td style="text-align: right;"> 3588.2 </td></tr>
<tr><td style="text-align: right;"> 5018.75</td></tr>
<tr><td style="text-align: right;"> 3488.16</td></tr>
</tbody>
</table>
Так что он печатает буквально html в шаблоне
Я попытался воспроизвести проблему, с которой вы столкнулись, используя ваш собственный код, но, похоже, у меня нет никаких проблем.
Вот мой код:
# index.html
{% for value in content_pdf %}
<span {% if value in diff_set %} style="color: red;" {% endif %}>
{{value}}
</span>
{% endfor %}
# views.py
# i dont know exactly what your 'content_pdf' contains, so this is what i did.
content_pdf = {5018.75, 1809, 4000, 5018.4}
diff_set = {5018.75, 3588.2, 3588.1, 5018.4}
context = {
'content_pdf': content_pdf,
'diff_set': diff_set,
}
return render(request, "index.html", context)
Так что это может быть одно из двух.
- Ваш diff_set не содержит точного значения, которое имеет content_pdf .
- Вы должны передать diff_set и content_pdf в отдельный dict и передать его в контекст (что я и сделал)
Вы можете попробовать показать {{value}} в front-end for loop, чтобы увидеть, есть ли что-то неправильное/пропущенное
Или вы можете попробовать распечатать content_pdf (частично, если он большой) отдельно от diff_set
Надеюсь, это вам как-то поможет.
Я редактирую методы. И вставляю это в шаблон:
<ul class="nobull">
{% for value in content_pdf %}
<span {% if value in diff_set %} style="color: red;" {% endif %}>
<li>{{value}}</li>
</span>
{% endfor %}
</ul>
<ul class="nobull">
{% for value in content_excel %}
<span {% if value in diff_set %} style="color: red;" {% endif %}>
<li>{{value}}</li>
</span>
{% endfor %}
</ul>
в результате:
3588.2 3588.1
5018.75 5018.4
3488.16 3488.16