Django 1.1 基于日期的通用视图问题 - archive_year, archive_month, archive_day

0 投票
1 回答
698 浏览
提问于 2025-04-15 17:11

我正在做我的第一个Django博客,想通过年、月、日来获取帖子,使用的是Django自带的通用视图,但结果却不太对。(抱歉我这个问题问得不太专业……如果有人知道该问什么合适的问题,请告诉我)

我觉得还是把我的配置给你们看,这样你们能更好地理解我的情况:

完整的博客 URL 配置:

from django.conf.urls.defaults import *

from weblog.models import Entry

entry_info_dict = {
    'queryset': Entry.published,
    'date_field': 'pub_date',
    'template_object_name': 'Entry',
    }

urlpatterns = patterns('django.views.generic.date_based',
      (r'^$', 'archive_index', entry_info_dict, 'weblog_entry_archive_index'),
      (r'^(?P<year>\d{4})/$',
       'archive_year', entry_info_dict,
       'weblog_entry_archive_year'),
      (r'^(?P<year>\d{4})/(?P<month>\w{3})/$',
       'archive_month',
       entry_info_dict,
       'weblog_entry_archive_month'),
      (r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/$',
       'archive_day',
       entry_info_dict,
       'weblog_entry_archive_day'),
      (r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
       'object_detail',
       entry_info_dict,
       'weblog_entry_detail'),
)

urls.py 文件:

urlpatterns = patterns('',
(r'^blog/', include('weblog.urls.entries')),
...
)

entry_archive_year.html 文件:

            <h2>Archive for {{ year }}</h2>
            <ul>
                    {% for month in pub_date %}
                    <li>
                            <a href="/blog/{{ year }}/{{ month|date:"b" }}/">{{ month|date:"F" }}</a>
                    </li>
                    {% endfor %}
            </ul>

假设我有这样一篇博客文章:

example.com/blog/2009/dec/18/test

现在我请求:

example.com/blog/2009/

结果却没有任何内容,虽然输入完整的URL时,文章是能显示出来的。

我觉得Django在某个地方出问题了,虽然它是DEBUG模式,但我找不到具体是哪里出错了。希望能得到一些帮助。

1 个回答

2

月份信息是存储在上下文变量 date_list 中,而不是 pub_date

根据 Django 文档中关于 archive_year 的说明:

模板上下文:

除了 extra_context,模板的上下文还包括:

  • date_list:一个包含 datetime.date 对象的列表,这些对象代表在指定年份中,根据查询集可用的所有月份,按顺序排列。

下面的代码应该可以解决这个问题:

{% for month in date_list %}
    <li>
        <a href="/blog/{{ year }}/{{ month|date:"b" }}/">{{ month|date:"F" }}</a>
    </li>
{% endfor %}

撰写回答