Сравнение двух списков друг с другом и выделение разницы цветом с помощью 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)

Передний конец: difference in red

Так что это может быть одно из двух.

  • Ваш 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
Вернуться на верх