Как добавить этот оператор if в шаблон с Django и улучшить views.py - PullRequest
2 голосов
/ 29 мая 2020

Мои знания о html и Django очень ограничены, но у меня есть этот Django проект с несколькими (12) HTML страницами, которые отображают информацию в таблице, аналогичной приведенному ниже коду. Таблица отображается условно, если осталось внести какие-либо исправления. Если какие-либо данные в исправлениях уже были протестированы, они должны быть выделены красным, чтобы избежать редактирования. Недавно я добавил бит <tr {% if p.tested in green_tested %} bgcolor="red" {% endif %}> для выделения, но мне показалось очень глупым добавлять его вручную на все 12 страниц. Есть ли способ добавить его как часть внешнего шаблона?

{% extends "admin/base_site.html" %}
{% load static %}

{% block content %}

<p><b>Description:</b> {{ docstring }}</p>
{% if count|length %}
    <p><b>Action:</b> Investigate why and fix.</p>
    <p style="color:red">If any table rows are highlighted red, indicating a tested profile, flag immediately to health report owner/Automation before editing.</p>
    <table>
      <tr bgcolor="#ccc">
        <th>Profile</th>
        <th>Name</th>
        <th>Type</th>
        <th>Tested</th>
        <th>e.g. Device</th>
      </tr>
    {% for p in count %}
      <tr {% if p.tested in green_tested %} bgcolor="red" {% endif %}>
        <td><a href={{ p.profile_url }}>{{ p.url }}</a></td>
        <td>{{ p.name }}</td>
        <td>{{ p.type }}</td>
        <td>{{ p.tested }}</td>
        <td><a href={{ p.device_url }}>{{ p.dev_id }}</a></td>
    {% endfor %}
      </tr>
    </table>
{% else %}
No fixes left to make!
{% endif %}

{% endblock %}

Моя функция в views.py выглядит примерно так:

def test_function(request):
    count = test_function_count()
    context = {'count': count,
                'green_tested': list(map(lambda x: x[0], models.GREEN_TESTED)),
                'docstring': test_function_count.__doc__}
    return render(request, 'health_report/test-function-page.html', context)

Это также будет приятно, что мне не нужно добавлять 'green_tested' ко всем моим функциям в представлениях.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Для проблемы с green_tested в каждом представлении я предлагаю использовать обработчик контекста. Сначала вам нужно создать новый файл context_processors.py в том же месте, где находится ваш view.py. Вот так:

def function_name(request):
    data = # here put logic you want
    return {
        'context_data': data
    }

Затем вам нужно зарегистрировать ваш контекстный процессор в файле settings.py в TEMPLATES. Шаблон: YourAppName.FileName.FunctionName Пример здесь (я не заменяю YourAppName, потому что я этого не знаю):

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['YourAppName/templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

                # Here is new line
                'YourAppName.context_processor.function_name',
            ],
        },
    },
]

Тогда вы можете в любом шаблоне использовать {{ context_data }}, имя ключ в словаре, возвращаемом функцией.

По основной проблеме у меня есть только предложение. Вы можете создать какой-то родительский шаблон, например ваш «base_site. html». Что-то между base_site. html и текущим шаблоном. Но линия, которую вы хотите разместить, находится где-то посередине, поэтому я не уверен, сработает ли это для вас или чем эти шаблоны похожи друг на друга. Это может создать больше проблем, чем повторение этой строки 12 раз.

{% extends "admin/base_site.html" %}
{% load static %}

{% block content1 %}
{% endblock %}

 Here the code you want in each template.

{% block content2 %}
{% endblock %}
0 голосов
/ 29 мая 2020
{% extends "admin/base_site.html" %}
{% load static %}

{% block content %}

<p><b>Description:</b> {{ docstring }}</p>
{% if count|length !=0 %}
    <p><b>Action:</b> Investigate why and fix.</p>
    <p style="color:red">If any table rows are highlighted red, indicating a tested profile, flag immediately to health report owner/Automation before editing.</p>
    <table>
      <tr bgcolor="#ccc">
        <th>Profile</th>
        <th>Name</th>
        <th>Type</th>
        <th>Tested</th>
        <th>e.g. Device</th>
      </tr>
    {% for p in count %}
      <tr {% if p.tested in green_tested %} bgcolor="red" {% endif %}>
        <td><a href="{{ p.profile_url }}">"{{ p.url }}"</a></td>
        <td>{{ p.name }}</td>
        <td>{{ p.type }}</td>
        <td>{{ p.tested }}</td>
        <td><a href={{ p.device_url }}>{{ p.dev_id }}</a></td>
    {% endfor %}
      </tr>
    </table>
{% else %}
No fixes left to make!
{% endif %}

{% endblock %}
...