UpdateView 中的自动更新 slug 字段

Auto update slug field in UpdateView

我有一个简单的博客,其中 post 模型包含一个预填有 post 标题的 slug 字段。我想知道当用户在 viewUpdate 中更新 post 标题时如何在后台更新这个 slug:

models.py

class Post(models.Model):
    title = models.CharField(max_length=150)
    content = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE
    )

    slug = models.SlugField(unique=True)

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

    def save(self, *args, **kwargs):
        self.slug = self.slug or slugify(self.title)
        super().save(*args, **kwargs)

urls.py

urlpatterns = [
    path('post/<slug:slug>/', views.PostDetailView.as_view(), name='post_detail'),

]

views.py

class PostUpdateView(UpdateView):
    model = Post
    fields = ['title', 'content', 'tags']

我想我应该在 view.py 中添加其他内容,以便更新 slug,但在谷歌搜索了几个小时后,我找不到它。

如果您需要更多信息,请告诉我。这是一个非常简单的问题,所以我不确定是否应该提供其他任何信息。

您可以将save方法更改为:

class Post(models.Model):

    # …

    def save(self, *args, **kwargs):
        <b>self.slug = slugify(self.title)</b>
        super().save(*args, **kwargs)

话虽如此,更换弹头本身并不是一个好主意。 URL 中通常使用 slug。因此,这意味着如果 Post 的 URL 被用户添加为书签,后来标题发生变化,那么 URL 将不再有效。因此,slug 通常是不应该(经常)修改的东西。事实上在大多数 内容管理系统 (CMS) 中,slug 并没有改变,您可以查看 URL 以查看 原始 文章标题。