Django - 非连续月份

Posted

技术标签:

【中文标题】Django - 非连续月份【英文标题】:Django - non-consecutive months 【发布时间】:2011-06-25 03:16:06 【问题描述】:

我想在我的博客旁边制作一个列表,显示只有条目的年份和月份,如下所示:

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

我已经建立了一个自定义模板标签(感谢Alasdair 和cig212):

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

【问题讨论】:

我希望这个问题更清楚了。 【参考方案1】:

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

输出的年份和月份都颠倒了。完美!

【讨论】:

【参考方案2】:

改变

 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 %

这应该可以满足您的需要。

【讨论】:

以上是关于Django - 非连续月份的主要内容,如果未能解决你的问题,请参考以下文章

将连续的月份数添加到数据框[重复]

如何检查表列中的三个日期是不是连续月份

SQL 判断是不是已经过了多个连续的月份

根据具有标准的组对连续月份求和

在 Python 中创建连续年份月份的列表

ORACLE将连续或不连续月份合并sql怎么写,要求不通过存储过程实现