Django sistema de templates: Como faço para resolver este looping / agrupamento / contagem?

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

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma lista de artigos, e cada artigo pertence a uma seção.

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)
  # ...

Eu quero mostrar os artigos, agrupados por seção.

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%

Eu descobri como fazer mais do mesmo com sistema de templates do 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 %}

Eu não posso descobrir como fazer os números. O código acima números os artigos na Sports Media 1-5 em vez de 6-10. Alguma sugestão?

Foi útil?

Solução

A seguir suggeston de Jeb em um comentário, eu criei um costume tag .

Eu substituí {{ forloop.counter }} com {% counter %}, uma marca que simplesmente imprime quantas vezes ele foi chamado.

Aqui está o código para o meu contador de tag.

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()

Outras dicas

Este não é exatamente limpo, mas pode ser apropriado para alguém:

{% 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 %}

Eu acho que você pode usar forloop.parentloop.counter interior do circuito interno para alcançar a numeração que você está depois.

Você pode usar apenas uma lista ordenada em vez de não-ordenada:

{% 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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top