Минимизируйте повторение кода, создав повторно используемый шаблон - PullRequest
1 голос
/ 25 октября 2019

У меня есть шаблон, который включает в себя 4 разных пагинатора, которые отличаются только контекстными переменными (tasks_today, tasks_testival и т. Д.), И я хочу свести к минимуму повторение кода, чтобы у меня не было 4 разных шаблонов paginator.

Шаблон:

<div class="wrapper">
    <h3>Today</h3>
    <table>
    {% if tasks_today %}
        {% for task in tasks_today %}
            {% include 'todo/task_table_row.html' %}
        {% endfor %}
        {% include 'todo/paginator_today.html' %}
    {% else %}
        <p>No tasks for today.</p>
    {% endif %}
    </table>
    <h3>Tomorrow</h3>
    <table>
    {% if tasks_tomorrow %}
        {% for task in tasks_tomorrow %}
            {% include 'todo/task_table_row.html' %}
        {% endfor %}
        {% include 'todo/paginator_tomorrow.html' %}
    {% else %}
        <p>No tasks for tomorrow.</p>
    {% endif %}
    </table>
    <h3>Upcoming</h3>
    <table>
    {% if tasks_upcoming %}
        {% for task in tasks_upcoming %}
            {% include 'todo/task_table_row.html' %}
        {% endfor %}
        {% include 'todo/paginator_upcoming.html' %}
    {% else %}
        <p>No upcoming tasks.</p>
    {% endif %}
    </table>
    <h3>Past</h3>
    <table>
    {% if tasks_past %}
        {% for task in tasks_past %}
            {% include 'todo/task_table_row.html' %}
        {% endfor %}
        {% include 'todo/paginator_past.html' %}
    {% else %}
        <p>No tasks in the past.</p>
    {% endif %}
    </table>
</div>

paginator_today:

{% load url_replace %}

{% if tasks_today %}
<div class='paginator'>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            {% if tasks_today.has_previous %}
                <li class="page-item">
                    <a class="page-link" href="?{% url_replace page_today=1 %}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
                <span class="sr-only">begin</span>
            </a>
                </li>
            {% endif %}

    {% for n in tasks_today.paginator.page_range %}
        {% if tasks_today.number == n %}
        <li class="page-item active">
            <span class="page-link">{{ n }}
                <span class="sr-only">(current)</span>
            </span>
        </li>
        {% elif n > tasks_today.number|add:'-3' and n < tasks_today.number|add:'3' %}
            <li class="page-item">
                <a class="page-link" href="?{% url_replace page_today=n %}">{{ n }}</a>
            </li>
        {% endif %}
    {% endfor %}

    {% if tasks_today.has_next %}
        <li class="page-item">
            <a class="page-link" href="?{% url_replace page_today=tasks_today.paginator.num_pages %}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
                <span class="sr-only">end</span>
            </a>
        </li>
    {% endif %}
        </ul>
    </nav>
</div>
{% endif %}

paginator_tomorrow:

{% load url_replace %}

{% if tasks_tomorrow %}
<div class='paginator'>
    <nav aria-label="Page navigation">
        <ul class="pagination">
            {% if tasks_tomorrow.has_previous %}
                <li class="page-item">
                    <a class="page-link" href="?{% url_replace page_tomorrow=1 %}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
                <span class="sr-only">begin</span>
            </a>
                </li>
            {% endif %}

    {% for n in tasks_tomorrow.paginator.page_range %}
        {% if tasks_tomorrow.number == n %}
        <li class="page-item active">
            <span class="page-link">{{ n }}
                <span class="sr-only">(current)</span>
            </span>
        </li>
        {% elif n > tasks_tomorrow.number|add:'-3' and n < tasks_tomorrow.number|add:'3' %}
            <li class="page-item">
                <a class="page-link" href="?{% url_replace page_tomorrow=n %}">{{ n }}</a>
            </li>
        {% endif %}
    {% endfor %}

    {% if tasks_tomorrow.has_next %}
        <li class="page-item">
            <a class="page-link" href="?{% url_replace page_tomorrow=tasks_tomorrow.paginator.num_pages %}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
                <span class="sr-only">end</span>
            </a>
        </li>
    {% endif %}
        </ul>
    </nav>
</div>
{% endif %}

Что я могу сделать?

url_replace.py:

from django.utils.http import urlencode
from django import template
​
register = template.Library()
​
@register.simple_tag(takes_context=True)
def url_replace(context, **kwargs):
    query = context['request'].GET.dict()
    query.update(kwargs)
    return urlencode(query)

1 Ответ

1 голос
/ 25 октября 2019

Вы можете использовать ключевое слово with, чтобы установить определенные переменные в вашем включаемом шаблоне:

{% include 'todo/paginator.html' with tasks=tasks_today page='page_today' %}

Затем вы можете заменить ссылки на tasks_today в вашем шаблоне paginator на tasks, а такжессылка на page_today на page


Редактировать: вызов url_replace проблематичен, поскольку он использует kwargs, а вызов, подобный {% url_replace page_today = x %}, будет эквивалентен вызовуurlreplace(context, **{'page_today' : x}).

Простой вызов url_replace с page = x не будет работать правильно, поскольку он передаст аргумент ключевого слова с именем page вместо значения page

Наивное решение будетпередать page переменную paginator.html и вызвать {% urlreplace **{page : 20} %}, но шаблонизатор Django не позволяет упаковывать kwargs.

Я думаю, что лучший способ сделать это - создать url_replace_single функция, так как в этом случае вы заменяете только одно значение. Для этого вам нужно определить параметр поля и значения в вашей функции url_replace:

@register.simple_tag(takes_context=True)
def url_replace(context, field, value, **kwargs):
    query = context['request'].GET.dict()
    query_dict = { field : value}
    query.update(query_dict)
    return urlencode(query)

Затем вызвать функцию из вашего шаблона следующим образом:

{% url_replace field=page value=x %}

недостатком является то, что это позволит вам заменить только один параметр запроса в вашем URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...