我正在尝试配置我的应用程序的路由,以便通过pk查找相应的视图页面,并返回一个重定向,其中包含正确的后续跟踪的正确URL。
例如,我的模型Post
包含title
和slug
字段。假设我有一个Post
对象,其中包含pk 1
和slug hello-world
。我想要发生的是,您将被重定向到/post/1/hello-world/
,无论我是否导航到:
/post/1/
/post/1/hello-world/
或/post/1/wrong-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})
这让我(上面)(检索正确的视图),但不是(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
方法(遵循this question中描述的模式):
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仍然保留为您最初输入的内容。
有谁知道如何使这个工作?
答案 0 :(得分:0)
我认为您在重定向中错过了一个条件:
def post(request, post_id, slug):
post = get_object_or_404(Post, pk=post_id)
if slug != post.slug
return redirect('blog-post', post.id, post.slug)
else:
return render(request, 'blog/post.html', {'post': post})