2011-02-10 33 views
1

我想制作我的博客上的,显示了当年侧的列表中,并且只有条目的几个月里,像这样的:Django的 - 非连续两个月

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(),但我在某个地方迷路了。

+0

那么你的问题是什么? – 2011-02-10 21:53:18

回答

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

这应该做你所需要的。

1

嘿heey Aidas,非常感谢。我需要更多地阅读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 %} 

和输出具有两年及逆转个月。完善!