【问题标题】:Auto update slug field in UpdateViewUpdateView 中的自动更新 slug 字段
【发布时间】:2020-02-25 13:11:47
【问题描述】:

我有一个简单的博客,其中帖子模型包含一个预填充帖子标题的 slug 字段。我想知道当用户在 viewUpdate 中更新帖子标题时如何在后台更新此 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,但在谷歌搜索数小时后,我找不到它。

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

【问题讨论】:

  • self.slug = self.slug or slugify(self.title) 更改为self.slug = slugify(self.title)
  • 那行得通,现在我知道模型.py 中的 save() 在帖子更新时被激活。谢谢!

标签: django django-views slug


【解决方案1】:

您可以将save方法更改为:

class Post(models.Model):

    # …

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

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

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 2013-08-22
    • 2021-05-20
    • 2020-07-05
    • 2016-12-22
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多