Django URLconf中的零填充数

时间:2011-05-23 14:11:42

标签: python regex django url

documentation of Django是文章网址的示例模式:

(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),

因此,只有2011/05/23/会匹配,而不是2011/5/23/

在文档的另一部分中,解释了permalinks decorator,模式是

(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),但这看起来有点麻烦且过于冗余(如果我更改了URLconf,我将需要我也改变了get_absolute_url方法。

此外,我们现在有多个网址都显示相同的内容(2011/05/03/2011/5/03/2011/05/3/等),这可能是一个问题,例如对于搜索引擎?至少它会导致网址不一致。

是否有一种(简单)方法可以将所有网址重定向到零填充网址(2011/5/3/> 2011/05/03/),并且还会自动始终将它们构建为零填充,因此我不需要在像get_absolute_url这样的方法有str()和zfill,只能传递数字?

2 个答案:

答案 0 :(得分:0)

我不知道让Django自动将作为参数传入的填充数字归零到URL,而不是你已经这样做了。

如您所述,您可以放松正则表达式以不要求零,这会产生重复的内容问题。但是,@ Matt没有考虑到内容必须实际暴露在两个URL上,以便搜索引擎认为它是重复的。更有可能的是,您网站上的所有网址都是由reverse(或models.permalink get_absolute_url附近的{% url %}装饰器)或<link rel="canonical" href="http://domain.com/archive/2011/5/3/" /> 模板标记组成的。因此,所有的URL都是相同的格式,即没有零,搜索引擎甚至都不会看到零版本。

此外,您可以使用规范标记让搜索引擎知道内容不重复,但只能通过多个网址获取。

{{1}}

所以搜索引擎无需担心。

答案 1 :(得分:0)

url.py删除包含不存在的视图的不必要链接。