Django Template System: Comment résoudre ce problème de bouclage / regroupement / comptage?

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

  •  08-07-2019
  •  | 
  •  

Question

J'ai une liste d'articles et chaque article appartient à une section.

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

Je souhaite afficher les articles, regroupés par section.

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%

J'ai compris comment faire la plupart avec le système de templates de 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 %}

Je n'arrive pas à comprendre comment faire les chiffres. Le code ci-dessus numérote les articles dans Sports Media 1-5 au lieu de 6-10. Des suggestions?

Était-ce utile?

La solution

À la suite de la suggestion de Jeb dans un commentaire, j'ai créé un balise de modèle personnalisé .

J'ai remplacé {{forloop.counter}} par {% counter%} , une balise qui indique simplement combien de fois le numéro a été appelé.

Voici le code de ma balise 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()

Autres conseils

Ce n’est pas vraiment bien, mais peut convenir à quelqu'un:

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

Je pense que vous pouvez utiliser forloop.parentloop.counter à l'intérieur de la boucle interne pour obtenir la numérotation que vous recherchez.

Vous pouvez simplement utiliser une liste ordonnée au lieu de non ordonnée:

{% 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top