Django URLconf 中的零填充数字
在Django的文档中,有一个关于文章URL的例子:
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
所以,只有 2011/05/23/
这个格式会匹配,但 2011/5/23/
这个格式就不行。
在文档的另一部分,解释了永久链接装饰器,这里的格式是:
(r'/archive/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$', archive_view)
还有创建永久链接的代码:
@models.permalink
def get_absolute_url(self):
return ('archive_view', (), {
'year': self.created.year,
'month': self.created.month,
'day': self.created.day})
特别地,月份的格式从 \d{2}
改成了 \d{1,2}
,所以现在 2011/05/23/
和 2011/5/23/
都可以匹配;get_absolute_url
方法会生成第二个链接,也就是没有前导零的那个。
如果我想为第一个正则表达式(\d{2}
)创建一个永久链接,我可以在方法中写 str(self.created.month).zfill(2)
,但我觉得这样有点麻烦,而且太重复了(如果我更改了URL配置,我也需要更改 get_absolute_url
方法)。
另外,现在有多个URL都显示相同的内容(比如 2011/05/03/
、2011/5/03/
、2011/05/3/
等等),这会不会造成问题,比如对搜索引擎来说?至少这会导致URL不一致。
有没有简单的方法可以把所有的URL重定向到带零的格式(2011/5/3/
› 2011/05/03/
),并且总是自动生成带零的格式,这样我就不需要在像 get_absolute_url
这样的函数里搞 str() 和 zfill,而只需要传递数字就可以了?
2 个回答
在url.py
文件中,删除那些指向不存在的视图的多余链接。
我知道的没有办法让Django自动把作为参数传入URL的数字补零,除了你现在已经在做的方式。
你可以放宽正则表达式的要求,不强制需要零,这样做会导致重复内容的问题。不过,@Matt没有考虑到,搜索引擎要认为内容是重复的,实际上这两个URL都得能被访问到。更可能的是,你网站上的所有URL都是通过reverse
(或者在get_absolute_url
上使用models.permalink
装饰器)或者{% url %}
模板标签生成的。因此,所有的URL格式都是一样的,也就是没有零的格式,而带零的版本根本不会被搜索引擎看到。
另外,你可以使用规范标签来告诉搜索引擎,这些内容并不是重复的,而只是通过多个URL可以访问。
<link rel="canonical" href="http://domain.com/archive/2011/5/3/" />
所以搜索引擎这方面不用担心。