在Django 1.6.5中的urls.py中使用Argument重定向URL

时间:2015-03-05 06:07:52

标签: python regex django django-urls

我最近从PHP切换到了Django。我在PHP中的旧网站已经集成了Disqus,当我迁移到新网站时,我的博客网址已从 / blog /< year> /< month> /< slug> / blog /< slug>

所有新评论都会自动获取新网址,但仍有很多旧链接仍为 < year> /< month> /< slug>

现在我希望它将所有 / blog /< year> /< month> /< slug> 重定向到 /博客/<蛞蝓>

我尝试了以下内容:

url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<slug>[^\.]+)', RedirectView.as_view(url=reverse_lazy('view_blog_post'))),
url(r'^(?P<slug>[^\.]+)', 'blog.views.view_post', name='view_blog_post'),

这给了我以下错误:

view_post() got an unexpected keyword argument 'year'

这似乎是显而易见的,因为我的观点只把slug作为一个论点。我不想写另一个视图来合并这个变化,因为它是暂时的。

请帮我找到解决方案。

问候。

1 个答案:

答案 0 :(得分:1)

view_blog_post模式需要一个slug,所以你不能只做reverse_lazy('view_blog_post')因为它不使用slug。

相反,您可以使用pattern_name参数,然后Django将使用args和kwargs来反转网址。

您还希望使用?:制作年份和月份non capturing groups,因为您不想使用这些来反转网址。

url(r'^(?:\d{4})/(?:\d{1,2})/(?P<slug>[^\.]+)', RedirectView.as_view(pattern_name='view_blog_post', permanent=True)),

默认的permanent在Django 1.9中切换到False,因此明确设置它以防止它在升级时意外更改是很好的。