2013-10-09 41 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

相關問題