Система шаблонов Django: Как мне решить этот цикл / группирование / подсчет?

StackOverflow https://stackoverflow.com/questions/290397

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть список статей, и каждая статья относится к разделу.

class Section(models.Model):
  name = models.CharField(max_length=200)

  def __unicode__(self):
    return self.name

class Article(models.Model):
  section = models.ForeignKey(Section)
  headline = models.CharField(max_length=200)
  # ...

Я хочу отобразить статьи, сгруппированные по разделам.

Sponsorships, Advertising & Marketing
1. Nike To Outfit All 18 Univ. Of Memphis Athletic Teams
2. Phil Jackson Questions Harrah's Signage At New Orleans Arena
3. Puma Hires N.Y.-Based Ad Agency Droga5 To Lead Global Account
4. Pizza Patrón To Replace Pizza Hut As AAC Exclusive Provider
5. Marketplace Roundup

Sports Media
6. Many Patriots Fans In New England Will Not See Tonight's Game
7. ESPN Ombudsman Says Net Should Have Clarified Holtz Situation
8. EA Sports To Debut Fitness Title For Nintendo Wii In Spring '09
9. Blog Hound: Rockets-Suns Scuffle Today's No.1 Topic
10. Media Notes

Leagues & Governing Bodies
11. DEI, Chip Ganassi Racing To Merge Into Four-Car Sprint Cup Team
12. NASCAR Roundtable Part II: New Strategies, Cutbacks Discussed
13. Average Ticket Price For NFL Playoff Games To Drop By 10%

Я понял, как сделать большую часть этого с помощью системы шаблонов Django.

{% regroup articles by section as articles_by_section %}

{% for article in articles_by_section %}    
    <h4>{{ article.grouper }}</h4>
    <ul>
    {% for item in article.list %}  
        <li>{{ forloop.counter }}. {{ item.headline }}</li>
    {% endfor %}
    </ul>
{% endfor %}

Я просто не могу понять, как сделать цифры. Код выше нумерует статьи в Sports Media 1-5 вместо 6-10. Есть предложения?

Это было полезно?

Решение

Следуя предложению Джеба в комментарии, я создал пользовательский тег шаблона .

Я заменил {{forloop.counter}} на {% counter%} - тег, который просто печатает, сколько раз он был вызван.

Вот код для моего счетчика тегов.

class CounterNode(template.Node):

  def __init__(self):
    self.count = 0

  def render(self, context):
    self.count += 1
    return self.count

@register.tag
def counter(parser, token):
  return CounterNode()

Другие советы

Это не совсем аккуратно, но может подойти кому-то:

{% for article in articles %}        
   {% ifchanged article.section %}
      {% if not forloop.first %}</ul>{% endif %}
      <h4>{{article.section}}</h4>
      <ul>
   {% endifchanged %}
          <li>{{forloop.counter}}. {{ article.headline }}</li>
   {% if forloop.last %}</ul>{% endif %}
{% endfor %}

Я думаю, что вы можете использовать forloop.parentloop.counter внутри внутреннего цикла, чтобы получить нумерацию, которую вы ищете.

Вы можете просто использовать упорядоченный список вместо неупорядоченного:

{% regroup articles by section as articles_by_section %}

<ol>
{% for article in articles_by_section %}        
    <h4>{{ article.grouper }}</h4>
    {% for item in article.list %}  
        <li>{{ item.headline }}</li>
    {% endfor %}
{% endfor %}
</ol>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top