【问题标题】:How do I perform a view lookup with a pk and subsequently redirect to a url with the correct slug? (django)如何使用 pk 执行视图查找并随后使用正确的 slug 重定向到 url? (django)
【发布时间】:2013-10-09 21:53:20
【问题描述】:

我正在尝试配置我的应用程序的路由,以便通过 pk 查找适当的视图页面,并返回带有正确 URL 的重定向,该 URL 具有正确的 slug。

例如,我的模型 Post 带有 titleslug 字段。假设我有一个带有 pk 1 和 slug hello-worldPost 对象。我希望发生的是,无论我导航到:

,您都会被重定向到/post/1/hello-world/
  • /post/1/
  • /post/1/hello-world/,或
  • /post/1/wrong-slug/

我想这样做的原因是,如果我碰巧将这篇文章的 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)
    

    但是当我导航到任何帖子时,我会收到“此网页存在重定向循环”错误。

  • 在我的Post 模型上覆盖get_absolute_url 方法(遵循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 仍然是您最初输入的内容。

有谁知道如何让它工作?

【问题讨论】:

    标签: django django-views django-urls response.redirect


    【解决方案1】:

    我认为您在重定向中缺少一个条件:

    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})
    

    【讨论】:

    • 呃,是的。漫长的一天是漫长的。谢谢:)
    猜你喜欢
    • 2014-07-12
    • 2015-04-19
    • 2020-04-19
    • 2015-09-16
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2015-02-24
    相关资源
    最近更新 更多