Django slug和id作为URL重定向

ber*_*add 5 python django

我正试图在Django中获得一些东西,已经好几个小时但没有成功.然而,我正在尝试使用友好的网址,例如'my-post-title-1234',其中最后的数字是帖子的ID,其余的则是帖子的标题.我通过使用slug和id得到了url,我可以在视图中检索它们.所以我检查ID是否存在,如果它存在,我做其余的,如果它不存在,我做404 DoesNotExist.在模型中我生成了slug field和slugified title.

到目前为止,一切都有效,除了一件事:用户能够编写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')
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

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)
Run Code Online (Sandbox Code Playgroud)

这是我的看法:

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)
Run Code Online (Sandbox Code Playgroud)

所以问题是:如果用户在id仍然良好时键入错误,我如何将'bla-bla-bla-1234'重定向(更改网址)到正确的slug到'my-post-title-1234'.

非常感谢.

Dan*_*man 6

好像你只需要检查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)
Run Code Online (Sandbox Code Playgroud)

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