1

適切なビュー ページが pk を介して検索されるように、アプリのルーティングを構成しようとしています。正しいスラッグが続く適切な URL を含むリダイレクトが返されます。

たとえば、とフィールドを持つモデルPostがあります。pkと slugを持つオブジェクトがあるとしましょう。私が望むのは、次の場所に移動しても、にリダイレクトされることです。titleslugPost1hello-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})

これにより、上記の (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)
    

    しかし、投稿に移動すると、「この Web ページにはリダイレクト ループがあります」というエラーが表示されます。

  • 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 は最初に入力したもののままでした。

これを機能させる方法を知っている人はいますか?

4

1 に答える 1

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})
于 2013-10-09T22:09:25.427 に答える