1

次のように、エントリのみを含む年と月を示すリストをブログの横に作成したいと思います。

2011 - Jan, Feb
2010 - Jan, Mar, May, Jun, Jul, Aug, Oct, Nov, Dec
2009 - Sep, Oct, Nov, Dec

カスタム テンプレート タグを作成して、base.html に配置できるようにしました。

現在、次のようなリストが生成されます。

2011 - 1, 2
2010 - 1, 3, 5, 6, 7, 8, 10, 11, 12
2009 - 9, 10, 11, 12

カスタム テンプレート タグを作成しました ( Alasdaircig212に感謝):

from django import template
from blog.models import Post

register = template.Library()

class PostList(template.Node):
def __init__(self, var_name):
    self.var_name = var_name

def render(self, context):
    my_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
       'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']

       arch = Post.objects.dates('publish', 'month', order='DESC')

       archives = {}
       for i in arch:
         year = i.year
         month = i.month
         if year not in archives: 
             archives[year] = [] 
             archives[year].append(month) 
         else: 
             if month not in archives[year]: 
                 archives[year].append(month)

    context[self.var_name] = archives.items()
    return ''


@register.tag
def get_post_list(parser, token):
    """
    Generates a list of months that blog posts exist.
    Much like the 'year' archive.

    Syntax::

      {% get_post_list as [var_name] %}

    Example usage::

      {% get_post_list as posts_list %}
      (This 'var_name' is the one inserted into the Node)

    """
    try:
       tag_name, arg = token.contents.split(None, 1)
    except ValueError:
       raise template.TemplateSyntaxError, "%s tag requires arguments" % token.contents.split()[0]
    m = re.search(r'as (\w+)', arg)
    if not m:
        raise template.TemplateSyntaxError, "%s tag had invalid arguments" % tag_name
    var_name = m.groups()[0]
    return PostListNode(var_name)

テンプレートは次のようになります。

{% load blog %}
{% get_post_list as posts_list %}
{% for years, months in posts_list %} 
    {{ years }} 
    {% for month in months %} 
    <a href="{{ years }}/{{ month }}">{{ month }}</a> 
    {% endfor %} 
    <br /> 
{% endfor %}

my_monthsでは、タグによって作成された月番号にカスタム タグ内のラベルを取得するにはどうすればよいでしょうか。カスタムタグで使用する必要があることはわかっていますenumerate()が、どこかで迷っています。

4

2 に答える 2

1

エイダス、どうもありがとう。Pythonリストについてもっと読む必要があります。あなたの答えはそれでした。

これが私が最終的に使用したコードです。カスタムタグの場合:

class PostList(template.Node):
def __init__(self, var_name):
    self.var_name = var_name

def render(self, context):
    my_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
       'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']

    arch = Post.objects.dates('publish', 'month', order='DESC')

    archives = {}
    for i in arch:
        year = i.year
        month = i.month
        if year not in archives: 
            archives[year] = {} 
            archives[year][month] = my_months[month - 1]
        else: 
            if month not in archives[year]: 
                archives[year][month] = my_months[month - 1]

    context[self.var_name] = sorted(archives.items(),reverse=True)
    return ''

リスト内の項目が反転していることに注意してください。

テンプレートの場合:

{% get_post_list as posts_list %}
{% for years, months in posts_list %} 
     {{ years }} 
     {% for month_number, month_name in months.items %} 
          <li>
             <a href="{{ years }}/{{ month_name|lower }}/">{{ month_name }}</a> 
          </li>
      {% endfor %} 
      <br /> 
{% endfor %}

そして、出力は年と月の両方が逆になっています。完全!

于 2011-02-11T15:54:02.030 に答える
1

変化する

 if year not in archives: 
     archives[year] = [] 
     archives[year].append(month) 
 else: 
     if month not in archives[year]: 
         archives[year].append(month)

 if year not in archives: 
     archives[year] = {} 
     archives[year][month] = my_months[month - 1]
 else: 
     if month not in archives[year]: 
         archives[year][month] = my_months[month - 1]

その後

{% for years, months in posts_list %} 
    {{ years }} 
    {% for month in months %} 
    <a href="{{ years }}/{{ month }}">{{ month }}</a> 
    {% endfor %} 
    <br /> 
{% endfor %}

{% for years, months in posts_list %} 
    {{ years }} 
    {% for month_number, month_name in months.items %} 
    <a href="{{ years }}/{{ month_number }}">{{ month_name }}</a> 
    {% endfor %} 
    <br /> 
{% endfor %}

これはあなたが必要とすることをするはずです。

于 2011-02-11T11:42:54.857 に答える