Django 模板和 URLconf 中的日期翻译
Posted
技术标签:
【中文标题】Django 模板和 URLconf 中的日期翻译【英文标题】:Date translation in Django templates and URLconf 【发布时间】:2012-03-08 07:32:36 【问题描述】:我在设置文件中有一个用法语设置的 django 网站。
在我的模板中,我有以下条目<a href="/ year / month|date:"b" /"> month|date:"F" </a>
。
在我的 URLconf 中,我输入了 url(r'^(?P<year>\d4)/(?P<month>\w3)/(?P<day>\d1,2)/$',MonthArchivePostView.as_view())
问题是在模板中,生成的日期是法语的(例如,对于二月,我有 <a href="/2012/fév/">Février</a>
),但 url 需要英文版本(/2012/feb/
)。
我不介意在网址中使用英文或法文的日期,我只需要在模板中生成相同的日期并在 URLconf 文件中进行预期。
谢谢
更新 quick-fix-not-really-a-solution :在任何地方使用 m
格式而不是 b
以使用 /02/
而不是 /feb/
所以在 urls.py 中
url(r'^(?P<year>\d4)/(?P<month>\d1,2)/$',
MonthArchivePostView.as_view()
),
在通用视图中
class MonthArchivePostView(dates.MonthArchiveView):
model = Post
month_format = '%m'
date_field = 'publish'
【问题讨论】:
【参考方案1】:您可以使用unlocalize
来避免模板中的本地化。
【讨论】:
如何与month|date:"b"
结合使用? month|unlocalize|date:"b"
输出一个空字符串,month|date:"b"|unlocalize
没有效果(还是法语)
那么不妨试试这个:% localize off % month|date:"b" % endlocalize %
奇怪的是,% localize off %
没有效果,即使只是在 month
上也是如此。另一方面, month|unlocalize
有效(只是格式不正确)。也许是一个错误
我刚刚在 irc 上问过,我们不能像我一样链接过滤器。建议是使用自定义标签或在视图中处理它。
好的,当我不想本地化某些数字时,我通常使用unlocalize
,所以我认为它也适用于日期。很好。【参考方案2】:
正如@jkbr 已经说过的,unlocalize 应该可以完成这项工作。
除此之外,你有没有想过在你的入口模型的模型定义中添加一个函数'get_absolute_url(self)'
,而不是在模板中定义url?
最好将内容定义(模型)与内容表示(模板)分开。
它还可以帮助您解决问题。
尝试在你的入门模型末尾添加一个类似的函数:
def get_absolute_url(self):
from time import strftime
return "%s%s" % (settings.SITE_URL,strftime("%Y/%b/",self.creation_date))
这应该可以工作(如果我理解正确的话,它是关于显示数据而不是解析数据,如 Django 文档的Format localization 部分所述。
然后在您的模板中,您可以执行以下操作:
<a href="entry.get_absolute_url"> month|date:"F" </a>
【讨论】:
谢谢,但我不知道该怎么做。我使用通用类(参见我的更新),所以我真的没有月份档案的模型。我使用模型 Post 我有一个函数 get_absolute_url 就像解释 here 通用类视图 returns 只有一个 DateQuerySet 和年份,没有模型。我使用的是泛型类,因为它应该更快更容易,但我不确定了。此外,get_absolute_url must 仅包含 ascii 字符,因此/2012/Feb/
而不是 /2012/fév/
。或者可能是/2012/f%C3%A9v/
,但不是那么好......
如果你对 url 使用 slugs 会更好,并避免使用非 ascii 字符。模板标签slugify 也可用于模型定义中,从django.template.defaultfilters
导入slugify
,如上所述here以上是关于Django 模板和 URLconf 中的日期翻译的主要内容,如果未能解决你的问题,请参考以下文章