Django Modelo do Sistema: Como faço para resolver este looping / agrupamento / contagem?

votos
3

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.

Patrocínios, Propaganda e Marketing
1. Nike para equipar todos os 18 Univ. De Memphis equipes atléticas
2. Phil Jackson perguntas Signage Harrah Na New Orleans Arena
3. Puma Hires NY-Baseado Ad Agency Droga5 para conduzir Global Account
4. Pizza Patrón Para substituir Pizza Hut Como AAC fornecedor exclusivo
5. Roundup mercado

Media Sports
6. Muitos dos patriotas de fãs no New England não verá o jogo desta noite
7. ESPN Provedor de Justiça diz Net deveria ter esclarecido Holtz Situação
8. EA Sports para debutar aptidão título para Nintendo Wii Na Primavera de '09
9. Blog Hound: Rockets-Suns Scuffle de hoje No.1 Tópico
10. Constata Mídia

Ligas e Órgãos de Governo
11. DEI, Chip Ganassi Corrida de se fundir em equipe de quatro Car Sprint Cup
12. NASCAR Roundtable Parte II: novas estratégias, cortes Comentadas
13. Preço Médio Ticket para NFL Playoff Jogos de deixar cair por 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 só não consigo 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?

Publicado 14/11/2008 em 16:21
fonte usuário
Em outras línguas...                            


4 respostas

votos
4

Após suggeston de Jeb em um comentário, eu criei uma tag modelo personalizado .

I substituídos ` 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()
Respondeu 21/11/2008 em 17:23
fonte usuário

votos
1

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 %}
Respondeu 11/12/2008 em 13:33
fonte usuário

votos
-1

Você poderia 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>
Respondeu 14/11/2008 em 19:50
fonte usuário

votos
-1

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

Respondeu 14/11/2008 em 16:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more