Domanda

Ho un elenco di articoli e ogni articolo appartiene a una sezione.

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

Voglio visualizzare gli articoli, raggruppati per sezione.

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%

Ho capito come fare la maggior parte con il sistema di template di 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 %}

Non riesco proprio a capire come fare i numeri. Il codice sopra numera gli articoli in Sports Media 1-5 anziché 6-10. Qualche suggerimento?

È stato utile?

Soluzione

Seguendo il suggerimento di Jeb in un commento, ho creato un tag modello personalizzato .

Ho sostituito {{forloop.counter}} con {% counter%} , un tag che stampa semplicemente quante volte è stato chiamato.

Ecco il codice per il mio tag 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()

Altri suggerimenti

Questo non è esattamente pulito, ma potrebbe essere appropriato per qualcuno:

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

Penso che puoi usare forloop.parentloop.counter all'interno del ciclo interno per ottenere la numerazione che stai cercando.

Potresti semplicemente usare un elenco ordinato anziché non ordinato:

{% 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top