Python Django slug和id作为URL重定向

Python Django slug和id作为URL重定向,python,django,Python,Django,我想在Django买点东西,已经好几个小时了,但是没有成功。然而,我尝试使用友好的URL,如“my-post-title-1234”,其中末尾的数字是帖子的id,前面的数字是帖子的标题。我使用slug和id获得了url,我可以在视图中检索这两个。所以我检查ID是否存在,如果它存在,我做其余的,如果它不存在,我做404 DoesNotExist。在模型内部,我生成了slug字段和slug化标题 到目前为止,除了一件事,一切都正常:用户能够编写bla-bla-bla-1234,它仍然会向他显示相同的

我想在Django买点东西,已经好几个小时了,但是没有成功。然而,我尝试使用友好的URL,如“my-post-title-1234”,其中末尾的数字是帖子的id,前面的数字是帖子的标题。我使用slug和id获得了url,我可以在视图中检索这两个。所以我检查ID是否存在,如果它存在,我做其余的,如果它不存在,我做404 DoesNotExist。在模型内部,我生成了slug字段和slug化标题

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

如果用户键入“bla-bla-bla-1234”,我想将其重定向到正确的slug“my-post-title-1234”

以下是我的url的外观:

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

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仍然良好的情况下输入slug不正确,如何将(更改url)重定向到正确的slug,从“bla-bla-bla-1234”到“my-post-title-1234”


非常感谢。

似乎您只需要检查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\u object\u或\u 404
。另外,请注意,调用函数中与函数本身同名的对象可能会导致混淆;避免这样做(这就是我使用上面的
obj
的原因)。

在Django中,重定向带有参数,您只需在重定向中输入“,”来传递slug


我建议将
post\u id
放在另一个斜杠
url(r'^(?P[-\w\d]+)/(?P\d+/$),views.post,name='post')
后面。我想这对你不起作用的原因是,可能另一个URL正在接收你的链接,你也可以尝试将该URL移到其他链接之上,以便首先对其进行处理。因此,我的URL看起来像/my post title/1234/,对吗?而且仍然不知道如何重定向或其他什么…大多数网站将ID放在slug之前,如
/1234 my title slug
正确,如果slug对象存在,您应该能够使用
123 my title
URL。只需确保没有另一个具有相同结构的URL,多谢了,工作得很有魅力,非常完美。根据django文档(快捷方式助手),我所要做的全部更改是:obj=get_object_或_404(Post,pk=Post_id)
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)
return redirect("post",slug=slug)