Django slug和id作为URL重定向

时间:2015-10-12 17:21:47

标签: python django

我试图在Django中获得一些东西,已经好几个小时但没有成功。但是,我尝试使用友好的网址,例如我的帖子标题-1234',最后的数字是帖子的ID,其余的就是帖子&# 39;标题。我通过使用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')

这是我的模特:

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)

所以问题是:如何将(更改网址)重定向到来自&#39; bla-bla-bla-1234&#39;如果用户在ID仍然不错的情况下错误地输入了slug,那么我的帖子标题为1234&#39;

非常感谢。

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

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

return redirect("post",slug=slug)