適切なビュー ページが pk を介して検索されるように、アプリのルーティングを構成しようとしています。正しいスラッグが続く適切な URL を含むリダイレクトが返されます。
たとえば、とフィールドを持つモデルPost
があります。pkと slugを持つオブジェクトがあるとしましょう。私が望むのは、次の場所に移動しても、にリダイレクトされることです。title
slug
Post
1
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})
これにより、上記の (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 は最初に入力したもののままでした。
これを機能させる方法を知っている人はいますか?