django - 尽管创建了独特的 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.py
andviews.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",]
解决方案
我解决了这个问题,令人惊讶的是,但我不知道为什么会这样。
class Meta:
ordering = ["-published_at", "-created_at",]
有一个额外的逗号。那个额外的逗号干扰了导致 IntegrityError 的 slug 创建。去搞清楚。
推荐阅读
- xml - 基于文档值分布的 Solr 功能
- flutter - 参数类型“Function”不能分配给参数类型“void Function(bool?)?”
- woocommerce - 如何在 WooCommerce 中根据运输等级包装产品?
- go - 如何从 URL 中检索域?
- r - 如何在R中将两个总和更改为两个for循环?
- c# - 如果表格不在焦点上,有没有办法按一个键使表格出现?
- java - 无法解析符号'StackPane' Intelij IDEA
- java - Spring Boot 2.5.0、Spring Cloud 2020.0.2 和 Hibernate 5.4.31 - H2 数据库多行插入失败
- php - 在 PHP 中使用 CURL 发送文件和参数
- php - 仅为特定的重力形式运行函数