gpt4 book ai didi

python - 基于 Django 年/月的帖子存档

转载 作者:太空狗 更新时间:2023-10-29 22:07:20 25 4
gpt4 key购买 nike

我是 Django 的新手,开始了一个应用程序,我做了模型, View 、模板,但我想在底部添加某种存档页面的,像这样的http://www.flickr.com/photos/ionutgabriel/3990015411/ .

所以我想列出所有年份,然后列出那一年的所有月份。几个月谁有帖子要链接等没有。我还想翻译月份名称,因为我需要用罗马尼亚语。

到目前为止我所做的是:

在我看来:

def archive(request): 
arch = Post.objects.dates('date', 'month', order='DESC')

archives = {}
for i in arch:
tp = i.timetuple()
year = tp[0]
month = tp[1]
if year not in archives:
archives[year] = []
archives[year].append(month)
else:
if month not in archives[year]:
archives[year].append(month)
return render_to_response('blog/arhiva.html', {'archives':archives})

在我的模板中:

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

这会返回如下内容:

       2008               10 
2009 10 9
2007 10

但我根本无法对它们进行排序...按年份或任何方式排序,而且我也不知道如何添加所有月份(名称),我希望它们像这样:

   2009 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec       
2008 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec
2007 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec

带有关于有条目的月份的链接。

感谢您的帮助!

附注对不起我的英语

LE:也许我以错误的方式提出问题,我知道如何获取日期,但我不知道如何将它们格式化为如下所示:

   2009 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec       
2008 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec
2007 Ian Feb Mar Apr Mai Iun Iul Aug Sept Oct Noi Dec

所有我可以从 arch = Post.objects.dates('date', 'month', order='DESC')

{{ archives }} 在模板中是这样的:

[datetime.datetime(2009, 10, 1, 0, 0), datetime.datetime(2009, 9, 1, 0, 0),
datetime.datetime(2008, 10, 1, 0, 0), datetime.datetime(2007, 10, 1, 0, 0)]

然后我尝试了一个循环:

{% for archive in archives %}

{{ archive }} <br />

{% endfor %}

得到:

2009-10-01 00:00:00 
2009-09-01 00:00:00
2008-10-01 00:00:00
2007-10-01 00:00:00

在那之后尝试了这样的事情:

{% for archive in archives %}

{{ archive|date:"Y: m" }} <br />

{% endfor %}

得到:

2009: 10 
2009: 09
2008: 10
2007: 10

我被卡住了,不知道如何格式化数据,这样我就可以得到不同的年份和所有的月份,并且只有那些有条目的月份是链接...

有什么想法吗?

提前致谢!

最佳答案

首先,日期时间格式字符串在 django docs 中给出。 .我认为您需要大写字母而不是小写字母“M”。

由于您想要显示一年中的所有 12 个月,即使只有部分有帖子,我们将创建一个 archives 对象以传递给模板。我选择在其中使用字典

  • 关键是年份
  • 值是 12 个 [datetime, bool] 对的列表,其中 datetime 代表月份,bool如果该月有帖子,则为真

下面是我们如何在 View 中构建 archives 对象。

from datetime import date

def archive(request):
arch = Post.objects.dates('date', 'month', order='DESC')

archives = {}

for i in arch:
year = i.year
month = i.month
try:
archives[year][month-1][1]=True
except KeyError:
# catch the KeyError, and set up list for that year
archives[year]=[[date(y,m,1),False] for m in xrange(1,13)]
archives[year][month-1][1]=True

return render_to_response('blog/arhiva.html',
{'archives':sorted(archives.items(),reverse=True)})

在模板中,我们遍历每年的月份,并在适当时显示链接。

{% for year, month_list in archives %}
{{ year }} archives:
{% for month, has_link in month_list %}
{% if has_link %}<a href="/{{ month.year }}/{{ month.month }}/">{% endif %}
{{ month|date:"M" }}
{% if has_link %}</a>{% endif %}
{% endfor %}
{% endfor %}

我还没有检查所有代码,因此可能存在一些错误。最好使用 url template tag对于链接,而不是硬编码 url 格式。我觉得我的答案可能过于复杂,但我花了一些时间打字,所以我不妨与全世界分享。


国际化

我没有用过Django的国际化功能,所以实在帮不上翻译的忙。我建议你看看 documentation ,如果有不明白的地方再问一个问题。

话虽如此,如果您只想显示罗马尼亚语的月份,这里有一个丑陋的方法。

首先,将以下行添加到 View 中存档函数的顶部。

rom_months = ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', 
'Iul', 'Aug', 'Sept', 'Oct', 'Noi', 'Dec']

然后将以下行替换到您的 View 中

archives[year]=[[date(y,k+1,1),False,rom] for k, rom in enumerate(rom_months)]

最后将以下内容代入模板

...
{% for month, has_link, rom_month in month_list %}
{% if has_link %}<a href="/{{ month.year }}/{{ month.month }}/">{% endif %}
{{ rom_month }}
...

关于python - 基于 Django 年/月的帖子存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com