基于日期的通用视图的语言问题

时间:2010-10-12 14:06:33

标签: django django-urls django-generic-views

我已将语言代码从en-us更改为es-ar,并且url开始失败。 示例:当我单击“Agosto 2010”时,URL为“http://mysite.com/weblog/2010/ago/”,服务器无法查找页面。但如果我浏览“http://mysite.com/weblog/2010/aug/,服务器会找到并显示该页面。

urls.py:

urlpatterns = patterns('django.views.generic.date_based',
         (r'^$', 'archive_index', entry_info_dict, 'coltrane_entry_archive_index'),
         (r'^(?P<year>\d{4})/$', 'archive_year', entry_info_dict, 
  'coltrane_entry_archive_year'),
         (r'^(?P<year>\d{4})/(?P<month>\w{3})/$', 'archive_month', entry_info_dict, 
  'coltrane_entry_archive_month'),
)

templatetags.py:

@register.inclusion_tag('coltrane/month_links_snippet.html')
def render_month_links():
    return {
        'dates': Entry.objects.dates('pub_date', 'month'),
    }

month_links_snippet.html:

<ul>
  {% for d in dates reversed %}
    <li><a href="/weblog/{{ d|date:"Y/b" }}/">{{ d|date:"F Y" }}</a></li>
  {% endfor %}
</ul>

1 个答案:

答案 0 :(得分:4)

archive_month通用视图采用month_format参数,该参数指定strftime指令(默认为'%b',对于语言环境的缩写月份名称)来解析{{} 1}}值与。

问题是month使用进程的POSIX locale,它是不是由Django自己的语言环境机制设置的(这是strftime模板过滤器的内容使用)。见前面这个问题:

您可以通过以下两种方式解决此问题:

  1. 要继续使用文本月份,请将Python的POSIX语言环境设置为与Django的date匹配,例如将LANGUAGE_CODE添加到您的设置模块中。这应该使locale.setlocale(locale.LC_ALL, LANGUAGE_CODE)解析由strptime模板过滤器生成的相同月份缩写。 (注意:这假设您将安装的区域设置视为静态,并且不会使用date之类的内容来动态更改它。)
  2. 要切换到数字月份(01-12),请进行以下更改:
    • LocaleMiddleware查看:archive_month,然后添加(?P<month>\d{2})
    • 模板:month_format='%m'