Я пытаюсь настроить маршрутизацию моего приложения таким образом, чтобы соответствующая страница просмотра просматривалась через pk, и она возвращает перенаправление с правильным URL-адресом, который имеет правильную последовательность.Как выполнить просмотр вида с помощью pk и затем перенаправить URL-адрес с правильным слизком? (django)
Например, у меня есть модель 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/
будет (а) возвращать правильный вид и (b) перенаправить на обновленный/правильный URL-адрес (aka /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})
Это заставляет меня (а) выше (получение правильного взгляда), но не (б). Для того, чтобы попытаться достичь (б), я попытался:
Выполнение переадресацией на мой пост зрения:
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-адрес остался таким, как вы набрали вначале.
Кто-нибудь знает, как это сделать?
Тьфу, да. Длинный день был долгим. Благодаря :) – 3cheesewheel