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 以查看 原始 文章标题。
我有一个简单的博客,其中 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 以查看 原始 文章标题。