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 - 非连续月份的主要内容,如果未能解决你的问题,请参考以下文章