在 Django 模型內新增 slug 欄位


在本教程中,我們將學習 Django 中的 SlugField

SlugField

SlugField 是一種使用現有資料生成 URL 的方法。你可以使用文章或頁面的標題來生成 URL。我們來看一個詳細的示例。

假設我們有一篇文章,名稱為 來自 Tutorialspointid = 5。那麼,我們可以將 URL 設為 www.tutorialspoint.com/posts/5/。內容編寫者很難透過之前的 URL 識別文章。但是,如果你有一個類似 www.tutorialspoint.com/this-isfrom-tutorialspoint 的 URL,那麼我們就可以很容易地識別出這篇文章。所以,SlugField 用於生成此類 URL。

我們來看一下我們的文章模型的程式碼。將你的模型與以下模型進行比較。

CHOICES = (
   ('draft', 'Draft'),
   ('published', 'Published'),
)
class Article(models.Model):
   title = models.CharField(max_length = 250)
   slug = models.SlugField(max_length = 250, null = True, blank = True)
   text = models.TextField()
   published_on = models.DateTimeField(auto_now_add = True)
   updated_time = models.DateTimeField(auto_now = True)
   status = models.CharField(max_length = 10, choices = CHOICES, default ='draft')
class Meta:
   ordering = ('_Published_At', )
   def __str__(self):
return self.title

現在,我們將向我們的專案中新增 SlugField。因此,它將根據標題自動生成 URL。

在專案級別目錄中建立一個名為 util.py 的檔案。我們必須在每次呼叫 Post 模型時生成 URL。為了實現這一目標,我們需要訊號。

import string
   from django.utils.text import slugify
   def get_random_string(size = 10, chars = string.ascii_lowercase + string.digits
   return ''.join(random.choice(chars) for _ in range(size))
def get_slug(instance, slug = None):
   if slug is not None:
      slug_two = slug
   else:
      slug_two = slugify(instance.title)
   Klass = instance.__class__
   is_exists = Klass.objects.filter(slug_two = slug_two).exists()
   if is_exists:
      slug_two = "{slug_two}-{random_string}".format(slug_two = slug_two, ran
      string = get_random_string(size = 5))
   return get_slug(instance, slug = slug)
return slug_two

models.py 檔案的末尾新增以下程式碼。

def pre_save_receiver(sender, instance, *args, **kwargs):
if not instance.slug_two:
instance.slug_two = get_slug(instance)
pre_save.connect(pre_save_receiver, sender = Article)

urls.py中編輯路徑,例如path('posts/', post)。根據程式碼編輯views.py

def article(request, slug):
obj = Article.objects.filter(slug__iexact = slug)
   if obj.exists():
      obj = obj.first()
   else:
      return HttpResponse('Article Not Found')
context = {
   'article': obj
}
return render(request, 'posts/post.html', context)

更新於:2020-09-21

410 次瀏覽

開始您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.