Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板系统:如何解决循环/分组/计数问题?_Python_Django_Django Templates - Fatal编程技术网

Python Django模板系统:如何解决循环/分组/计数问题?

Python Django模板系统:如何解决循环/分组/计数问题?,python,django,django-templates,Python,Django,Django Templates,我有一个文章列表,每篇文章都属于一个部分 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=2

我有一个文章列表,每篇文章都属于一个部分

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)
  # ...
我想显示文章,按部分分组

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% 赞助、广告和营销 1.Nike将为孟菲斯大学所有18支运动队提供装备 2.菲尔·杰克逊质疑哈拉在新奥尔良体育馆的标志 3.彪马聘请总部位于纽约的广告公司Droga5领导全球客户 4.必胜客将取代必胜客成为AAC独家供应商 5.市场综述 体育媒体 6.许多新英格兰的爱国者队球迷将看不到今晚的比赛 7.ESPN监察专员表示,Net应该澄清霍尔茨的情况 8.EA体育将在2009年春季为任天堂Wii首次推出健身冠军 9博客猎犬:火箭和太阳的混战是今天的头号话题 10媒体笔记 联盟和管理机构 11戴伊、奇普·加纳西将合并为四辆汽车的斯普林特杯车队 12NASCAR圆桌会议第二部分:讨论新战略、削减 13NFL季后赛的平均票价将下降10% 我找到了如何使用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 %}
{%将文章按节重新分组为文章按节%}
{第%}节的文章中的文章为%
{{article.grouper}}
    {article.list%中项目的%s}
  • {{forloop.counter}}。{{item.headline}
  • {%endfor%}
{%endfor%}

我就是不知道怎么做这些数字。以上代码将体育媒体中的文章编号为1-5,而不是6-10。有什么建议吗?

我想你可以在内部循环中使用forloop.parentloop.counter来实现你想要的编号。

你可以使用有序列表而不是无序列表:

{% 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>
{%将文章按节重新分组为文章按节%}
{第%}节的文章中的文章为%
{{article.grouper}}
{article.list%中项目的%s}
  • {{item.headline}
  • {%endfor%} {%endfor%}
    根据杰布在评论中的建议,我创建了一个

    我将
    {{forloop.counter}}
    替换为
    {%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()
    

    这不是很整洁,但可能适合某些人:

    {% 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 %}
    
    {%用于文章%中的文章]
    {%ifchanged article.section%}
    {%if不是forloop.first%}{%endif%}
    {{条.款}
    
      {%endifchanged%}
    • {{forloop.counter}。{{article.headline}
    • {%if-forloop.last%}
    {%endif%} {%endfor%}
    好主意,但该计数器仅在外部循环迭代时递增。第一部分的文章都标为1,第二部分的文章都标为2,等等。啊,当然。我想你必须为此制作一个定制的模板标签。这很好。一个小的改进可能是向标记传递一个可选参数,这样页面上就可以有多个计数器(self.count将是一个字典。)谢谢。实际上,我在同一个页面上有多个计数器,而且它“正常工作”。{%counter%}的每个实例对应于CounterNode的不同实例。所以每个{%counter%}单独跟踪它被调用的次数。