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

Redirect URL with Argument in urls.py in Django 1.6.5

我最近从 PHP 切换到 Django。我在 PHP 的旧站点集成了 Disqus,当我迁移到新站点时,我的博客 urls 从 /blog// 更改//blog/

所有新评论都自动取新的url,但是有很多旧的链接还是<年>/<月的形式>/<鼻涕虫>

现在我想让它重定向所有 /blog////博客/<鼻涕虫>

我尝试了以下方法:

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 作为参数。我不想编写另一个视图来合并此更改,因为它是临时的。

请帮我找到解决办法。

此致。

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

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

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

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

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