RedirectView给NoReverseMatch

时间:2019-03-27 18:59:10

标签: django redirect django-views django-urls django-2.1

Recently我已经更改了博客文章的路径,以使URL更清晰。

之前,我具有以下路径:

path("category/<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_post>/", views.singlePost, name='single_blog_post'),

现在,我是这样的:

path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

之前,get_absolute_url为:

class Category(models.Model):
.....
    def get_absolute_url(self): 
        return reverse("single_category", kwargs={"slug_category": self.slug_category})


class BlogPost(ModelPost, TimeManager):
.....
    def get_absolute_url(self): 
        return reverse("single_blog_post", kwargs={"slug_post": self.slug_post})

现在是这个:

class Category(models.Model):
.....
def get_absolute_url(self): 
    return reverse("single_category", kwargs={"slug_category": self.slug_category})


class BlogPost(ModelPost, TimeManager):
.....
def get_absolute_url(self): 
    return reverse("single_blog_post", kwargs={
                                            "slug_post": self.slug_post,
                                            "slug_category": self.category.slug_category,
                                            })

我正在尝试使用 RedirectView 重定向所有旧路径;然后进入 urls.py 我现在是这样的:

path("category/<slug:slug_category>/", RedirectView.as_view(pattern_name='single_category', permanent=True)),
path("<slug:slug_post>/", RedirectView.as_view(pattern_name='single_blog_post', permanent=True)),

path("categorie/", views.categoryList, name="list_category"),
path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),

path("", views.postList, name='list_post'),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

当我使用那些RedirectView时,向我显示此错误:

  

/ blog / gis /

中的NoReverseMatch      

带有关键字参数'{'slug_post'的'single_blog_post'的反向:   找不到'gis'}'。尝试了1种模式:   ['blog \ /(?P [-a-zA-Z0-9 _] +)\ /(?P [-a-zA-Z0-9 _] +)\ / $']

如果我注释了两个RedirectView路径,该错误消失了,我可以毫无问题地使用该网站,但是当我使用旧路径时,我看到404错误。

我不了解RedirectView的工作原理。有人可以给我一个例子吗?

1 个答案:

答案 0 :(得分:1)

问题是您的旧视图仅需要后条,而新视图另外需要类别条。但是,没有一种简单的RedirectView可以执行此重定向,因为它只能查看原始URL本身中传递的参数。它不知道如何去数据库中找到类别段符并在重定向中使用它。

因此,您需要自己编写重定向视图。可能很简单:

import routes from 'path/to/views/Views';

//rest of your code to render the routes.

请注意,redirect将自动调用Post的def redirect_with_category(request, slug): post = get_object_or_404(Post, slug=slug) return redirect(post, permanent=True) 方法。另外请注意,您想使用get_absolute_url返回301而不是302。