обратный подсчет в шаблоне django с тегом ‹ol›

Я хочу написать шаблон, который

  • разбит на страницы (не все элементы списка на одной странице)
  • нумеруется с -tag, потому что это наиболее семантический способ упорядочить список
  • можно перевернуть или нет
  • номера связаны с представленными моделями (каждый тег li содержит тег a, связанный с моделью). Это означает, что список не всегда начинается с 1.

Моя модель:

class Mymodel(models.Model):
  number = positiveIntegerField() 
  title = models.CharField(max_length=100)
  [...]

number уникальна, упорядочена и при заказе моделей с номером пробела нет; число основано на 1


Что у меня есть: (reverse - логическая переменная, которая сообщает, нужно ли переворачивать список или нет)

{% if reverse %}
<ol class="content" start="{{ article_list.0.number|add:article_list.count }}" reversed=true>
    {% for article in article_list reversed %}
        <li class="{% cycle '' '' '' '' 'seperate-bot border-gray' %}"><a href="{% url 'myapp:article' article.number %}">{{ article.title }}</a></li>
    {% endfor %}
{% else %}
<ol class="content" start="{{ article_list.0.number }}">
    {% for article in article_list %}
        <li class="{% cycle '' '' '' '' 'seperate-bot border-gray' %}"><a href="{% url 'manifest:article' article.number %}">{{ article.alt_title }}</a></li>
    {% endfor %}
{% endif %}
</ol>

К сожалению, обратная часть шаблона считается неправильно: последнее число всегда равно 1, чего быть не должно. Последнее число должно быть article_list.0.number + article_list.count (или: article_list|length) -1; или last_list_item.number что было бы лучше.

Это означает: (paginated_by = 3 для этого примера) символ "|" потому что ТАК меняет мой счет Как это должно быть: (reverse=true)

страница 1:

|3. лорем ипсум

|2. лорем ипсум

|1. лорем ипсум

страница 2:

|5. лорем ипсум

|4. лорем ипсум

Что я получаю: (плохая только страница 2)

страница 2:

|2. лорем ипсум

|1. лорем ипсум


Есть ли хороший способ избежать этого эффекта? (А откуда он?) В лучшем случае должен работать только в шаблоне.


person Asqiir    schedule 21.04.2017    source источник


Ответы (1)


Я не уверен, почему вы получите такой результат, но это кажется слишком сложным способом сделать что-то довольно простое.

Вы можете использовать встроенный фильтр last и тег шаблона with для доступа к последнему элементу в списке.

{% with article_list|last as last_article %}
<ol class="content" start="{{ last_article.number }}" reversed=true>
{% endwith %}

Однако я бы порекомендовал вам упорядочивать и реверсировать в функции просмотра, а не в шаблоне. Язык шаблонов Django по своему выбору не подходит для нетривиальной логики.

Что касается нумерации, вы можете явно присвоить атрибут значения элементу упорядоченного списка. Это решит вашу проблему.

<li value={{ article.number }} ...

Пример:

<ol>
  <li value=3>it doesn't
  <li>have to
  <li>make
  <li value=42>sense
</ol>

person Håken Lid    schedule 22.04.2017
comment
Благодарю вас! Я не знал, что есть что-то вроде value, и причина, почему бы не сделать это в представлении, заключается в том, что если бы я переопределил get_queryset, на текущей странице были бы другие записи. - person Asqiir; 22.04.2017