Django Template-System: Wie löse ich diese Looping / Gruppierung / Zählen?
-
08-07-2019 - |
Frage
Ich habe eine Liste von Artikeln, und jeder Artikel gehört zu einer Seite.
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)
# ...
Ich möchte die Artikel angezeigt werden, die von Abschnitt zusammengefasst.
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%
ich herausgefunden, wie die meisten davon mit Djangos Template-System zu tun.
{% 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 %}
Ich kann einfach nicht herausfinden, wie die Zahlen zu tun. Der obige Code-Nummern der Artikel in Sports Media 1-5 anstelle von 6-10. Irgendwelche Vorschläge?
Lösung
Jebs suggeston in einem Kommentar Folgen, habe ich eine eigener Template-Tag .
I ersetzt {{ forloop.counter }}
mit {% counter %}
, einen Tag, das druckt einfach, wie oft es genannt wurde.
Hier ist der Code für meinen Counter-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()
Andere Tipps
Dies ist nicht gerade ordentlich, aber angemessen sein kann für jemanden:
{% 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 %}
Ich glaube, Sie innerhalb der inneren Schleife verwenden forloop.parentloop.counter kann die Nummerierung Sie nach zu erreichen.
Sie könnten nur eine geordnete Liste anstelle von ungeordneten:
{% 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>