2013-10-09 2 views
1

Я пытаюсь настроить маршрутизацию моего приложения таким образом, чтобы соответствующая страница просмотра просматривалась через 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-адрес остался таким, как вы набрали вначале.

Кто-нибудь знает, как это сделать?

ответ

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

Смежные вопросы