首页 > 解决方案 > 尽管创建了独特的 slug 函数,但 blog_post.slog 上的 IntegrityError UNIQUE

问题描述

我是 django 的新手,对 python 也有些陌生。

我正在尝试创建一个简单的博客应用程序,我们都知道您希望为您的博客链接提供独特的 slug。但是我似乎无法摆脱这个独特的错误。

问题描述

当我创建博客文章时,我会根据标题创建一个 slug。然后我看看那个 slug 是否与数据库中的任何其他人匹配。如果是这样,我会在末尾添加一个小字符串。

然而,数据库不断抛出 IntegrityError。

我试过的

我一直import pdb; pdb.stack_trace()在尝试追踪问题。在我看来,这是在设置self.object.slug然后做之后发生的self.object.save()。不知何故,独特的蛞蝓可能不会被传递给save.(). 但我不确定如何调试超出这一点。我很感激调试过程中的帮助。

令人困惑的是,我正在使用(正常运行的)django 博客应用程序工作。我找不到我的代码和那个代码之间的区别,并且我尝试更改methods.pyandviews.py以匹配另一个博客的代码,但是该应用程序会产生独特的 slug 并且不会引发错误,而我的则不会。

我也尝试过重建数据库并从头开始。

没看过的地方

get_absolute_url(): 我不知道为什么这会是一个问题,但我还没有尝试调试它。我不完全知道它是如何reverse()工作的,阅读这是我早上的项目。

template.html: 我不确定为什么模板会成为问题。

相关代码

请让我知道我是否应该发布其他内容。

from .models import post
from .helpers in get_post_slug

class PostCreate(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    model = Post
    template_name = 'post_create.html'
    fields = ['title', 'published_at', 'body']
    success_message = "'%(title)s' was created"

    def form_valid(self, form):
        self.object = form.save()
        self.object.slug = get_post_slug(self.object.title)

        self.object.save()
        return HttpResponseRedirect(self.get_success_url())
from django.utils.text import slugify
from .models import Post
import uuid

def get_post_slug(post_title):
    slug = slugify(post_title)
    if Post.objects.filter(slug=slug).exists():
        slug += "-" + str(uuid.uuid4())[:8]
    return slug
class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    slug = models.SlugField(null=True, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    published_at = models.DateField(
        default=timezone.now,
        blank=True,
        null=True,
        help_text="Leave blank to keep as draft/unpublished. Use a future date for auto-posting.",)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={"slug":self.slug})

    class Meta:
            ordering = ["-published_at", "-created_at",]

标签: django

解决方案


我解决了这个问题,令人惊讶的是,但我不知道为什么会这样。

class Meta:
            ordering = ["-published_at", "-created_at",]

有一个额外的逗号。那个额外的逗号干扰了导致 IntegrityError 的 slug 创建。去搞清楚。


推荐阅读