2015-10-12 99 views
4

我试图在Django中获得某些东西,但已经好几个小时但没有成功。不过,我正在尝试使用友好的网址,比如“my-post-title-1234”,其中最后的数字是帖子的ID,在此之前是帖子的标题。我通过使用slu and和身份证获得了网址,我可以在两个视图中进行回顾。所以我检查ID是否存在,如果存在,我做其余的,如果它不存在,我做404 DoesNotExist。我在模型里面生成了slu field字段和段落标题。Django slu and和id为URL重定向

除了一件事情之外,一切都运作正常:用户可以写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为stil的时候输入错误,我重定向(更改url)以将“bla-bla-bla-1234”中的slug修改为“my-post-title-1234”我很好。

非常感谢。

+1

我建议把'post_id'放在另一个斜杠后面'url(r'^(?P [ - \ w \ d] +)/( ?P \ d +)/ $',views.post,name ='post')'。我认为这不适合你的原因,可能是另一个URL正在提取你的链接,你也可以尝试将URL移动到其他链接上方,以便首先处理它。 – WayBehind

+0

因此,我的网址看起来像/ my-post-title/1234 /,那是对的吗?并且仍然不知道如何重定向或什么... – bernadd

+0

大多数网站把ID放在slu before之前,比如'/ 1234-my-title-slug' – ahmed

回答

5

看起来像你只需要检查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以上。)

+0

老兄非常感谢,非常有魅力并且非常完美。所有我不得不改变你的答案,并根据django文档(快捷帮手): obj = get_object_or_404(Post,pk = post_id) – bernadd

+0

你说得很对,纠正了我的答案。 –