我正在尝试配置我的应用程序的路由,以便通过 pk 查找适当的视图页面,并返回具有正确 url 的重定向,该 URL 具有正确的 slug。
例如,我有Post
带有title
andslug
字段的模型。假设我有一个Post
带有 pk1
和 slug的对象hello-world
。我希望发生的是/post/1/hello-world/
,无论我导航到,您都将被重定向到:
/post/1/
/post/1/hello-world/
, 或者/post/1/wrong-slug/
我想这样做的原因是,如果我碰巧将这篇文章的 slug 更新为,例如,hello-world-revised
去/post/1/hello-world/
将(a)仍然返回正确的视图,并且(b)重定向到更新/正确的 url(又名/post/1/hello-world-revised/
)。
我的应用程序中有这个urls.py
:
urlpatterns = patterns('',
...
url(r'^(?P<post_id>\d+)(?:/(?P<slug>[\w\d-]+))?/$', views.post, name='blog-post'),
)
并在views.py
:
def post(request, post_id, slug):
post = get_object_or_404(Post, pk=post_id)
return render(request, 'blog/post.html', {'post': post})
这让我得到了上面的(a)(检索正确的视图),但不是(b)。为了尝试实现(b),我尝试过:
在我的帖子视图中执行重定向:
def post(request, post_id, slug): post = get_object_or_404(Post, pk=post_id) return redirect('blog-post', post.id, post.slug)
但是当我导航到任何帖子时,我会收到“此网页有重定向循环”错误。
覆盖
get_absolute_url
我的Post
模型上的方法(遵循此问题中描述的模式):class Post(models.Model): ... @models.permalink def get_absolute_url(self): kwargs = { 'post_id': str(self.id), 'slug': self.slug, ) return ('blog-post', (), kwargs)
但这没有任何效果;返回了正确的视图,但 URL 仍然是您最初输入的内容。
有谁知道如何让这个工作?