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的工作原理。有人可以给我一个例子吗?
答案 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。