2013-10-09 14 views
1

我试图配置我的应用程序的路由,以便通过pk查找适当的视图页面,并且它返回具有正确的slug后面的正确url的重定向。如何使用pk执行视图查找,然后使用正确的slug重定向到url? (Django)

例如,我有模型Posttitleslug字段。比方说,我有一个Post对象与pk 1和slug hello-world。我想发生的是,你将被重定向到/post/1/hello-world/,我是否导航到:

  • /post/1/
  • /post/1/hello-world/,或
  • /post/1/wrong-slug/

我之所以想(a)仍然返回正确的视图,并且(b)重定向到更新的/正确的url(又名),如果我碰巧更新这个帖子的slu to到hello-world-revised,则/post/1/hello-world/将)。

我有这个在我的应用程序的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模型(按照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

我认为你缺少的条件在您的重定向:

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}) 
+0

呃,是的。漫长的一天很漫长。谢谢 :) – 3cheesewheel

相关问题