【问题标题】:Django slug and id as URL redirectDjango slug 和 id 作为 URL 重定向
【发布时间】:2016-01-10 06:27:36
【问题描述】:

我试图在 Django 中获得一些东西,已经好几个小时了,但没有成功。但是,我正在尝试使用友好的网址,例如“my-post-title-1234”,其中末尾的数字是帖子的 ID,而在此之前的其余数字是帖子的标题。我通过使用 slug 和 id 获得了 url,我可以在视图中检索两者。所以我检查 ID 是否存在,如果它存在我做剩下的,如果它不存在我做 404 DoesNotExist。在模型内部,我生成了 slug 字段和 slugified 标题。

到目前为止一切正常,除了一件事:用户能够编写 bla-bla-bla-1234 并且它仍然会向他显示相同的数据(因为 id 存在)。我想要的是:

如果用户输入 'bla-bla-bla-1234',我想将他重定向到更正 slug 'my-post-title-1234'。

这是我的网址的样子:

url(r'^(?P<slug>[-\w\d]+)-(?P<post_id>\d+)/$', views.post, name='post')

这是我的模型:

class Post(models.Model):
    post_title = models.CharField(max_length = 125)
    text = models.TextField()
    slug = models.SlugField(null = False, blank = True)
    def __str__(self):
        return self.post_title
    def save(self, *args, **kwargs):
        self.slug = slugify(self.post_title)
        super(Post, self).save(*args, **kwargs)

这是我的看法:

def post(request, slug, post_id):
    try:
        post = Post.objects.get(id = post_id)
    except Post.DoesNotExist:
        raise Http404("Post does not exist")
    return HttpResponse(post_id)

所以问题是:如果用户在 id 是还好。

非常感谢。

【问题讨论】:

  • 我建议将post_id 放在另一个斜线url(r'^(?P&lt;slug&gt;[-\w\d]+)/(?P&lt;post_id&gt;\d+)/$', views.post, name='post') 后面。我认为这对您不起作用的原因可能是另一个 URL 正在获取您的链接,您也可以尝试将 URL 移到其他链接上方,以便首先处理它。
  • 所以我的 URL 看起来像 /my-post-title/1234/,对吗?并且仍然不知道如何重定向或其他东西......
  • 大部分网站把ID放在slug之前,比如/1234-my-title-slug
  • 正确,如果 slug 对象存在,您应该可以使用123-my-title URL。只要确保另一个具有相同结构的 URL 还没有到位

标签: python django


【解决方案1】:

似乎您只需要检查 slug 是否正确,如果不正确,则进行重定向。

from django.shortcuts import get_object_or_404, redirect

def post(request, slug, post_id):
    obj = get_object_or_404(Post, pk=post_id)
    if obj.slug != slug:
        return redirect('post', slug=obj.slug, post_id=obj.pk)

请注意,前四行有一个内置快捷方式:get_object_or_404。另外,请注意在函数中调用与函数本身同名的对象可能会导致混淆;避免这样做(这就是我在上面使用obj 的原因。)

【讨论】:

  • 老兄非常感谢,工作就像一个魅力和完美。我必须根据您的回答和 django 文档(快捷方式助手)进行更改:obj = get_object_or_404(Post, pk=post_id)
【解决方案2】:

在 Django 重定向中带有参数,您可以简单地将 slug 通过放置一个“,”传递给重定向。

return redirect("post",slug=slug)

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 2018-01-06
    • 2015-02-24
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2020-04-24
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多