Django URLconf 中的零填充数字

1 投票
2 回答
729 浏览
提问于 2025-04-16 18:10

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 个回答

0

url.py文件中,删除那些指向不存在的视图的多余链接。

0

我知道的没有办法让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/" />

所以搜索引擎这方面不用担心。

撰写回答