جانغو قالب النظام: كيف يمكنني حل هذه حلقات / التجمع / العد؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

ولدي قائمة من المقالات، وكل مادة ينتمي إلى القسم.

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%

وأنا أحسب كيفية القيام أكثر من ذلك مع نظام قالب جانغو.

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

وأنا فقط لا يمكن معرفة كيفية القيام الأرقام. رمز أعلاه أرقام المقالات في الرياضة 1-5 وسائل الإعلام بدلا من 6-10. أي اقتراحات؟

هل كانت مفيدة؟

المحلول

وبعد suggeston جيب في تعليق، أنا خلقت <لأ href = "http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-tags" يختلط = "noreferrer نوفولو"> مخصص العلامة قالب .

وأنا محل {{ 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 %}

واعتقد انه يمكن استخدام 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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top