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,只能传递数字?
答案 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
删除包含不存在的视图的不必要链接。