python - Django slug 和 id 作为 URL 重定向

标签 python django

我试图在 Django 中获得一些东西,已经好几个小时了,但没有成功。但是,我正在尝试使用友好的网址,例如“my-post-title-1234”,其中末尾的数字是帖子的 ID,之前的其余部分是帖子的标题。我通过使用 slug 和 id 获得了 url,我可以在 View 中检索它们。因此,我检查 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)

所以问题是:如果用户在 slug 中输入错误而 id 为还好。

非常感谢。

最佳答案

似乎您只需要检查 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 的原因。)

关于python - Django slug 和 id 作为 URL 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086833/

相关文章:

python - 查找单词在字符串中的位置

Python Socket(简单服务器脚本)

python - 如何修复 django 1.5 中的 localflavor 弃用警告?

python - 用于添加/编辑/删除主体的 Kerberos python 库?

python - 如何在Django中使用不同的数据库引擎进行测试和生产

python - Django管理页面:通过多个模型选择而不是原始文本来自定义ID的字典(JSONField)

python - Django REST框架解析request.data引发错误

php - 在 PHP 中构建管理界面的最快方法是什么?

python - Django Python loaddata 失败并出现 django.db.utils.IntegrityError

python - 如何使用 OpenCV 从图像中裁剪和提取图章?