首页 文章资讯内容详情

在Django模型中添加slug字段

2026-06-04 1 花语

在本教程中,我们将学习Django中的SlugField

SlugField

SlugField是一种使用已有数据生成URL的方法。您可以使用帖子或页面的标题生成URL。让我们看一个详细的例子。

假设我们有一篇名为This的文章,来自Nhoooid=5。然后,我们可以将URL设置为www.nhooo.com/posts/5/。内容作者很难识别带有先前URL的文章。但是,如果您拥有类似www.nhooo.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)