slug的含义是标称,在Django中,slug值有效url的一部分,能使url更加清晰易懂,比如有一篇文章,标题是“测试”,如果使用slug,那么它的url/article/ce-shi/,后面的部分就是slug,相比起使用id作为urlslug更加简明易懂

Django中使用

基本使用

  • 定义模型类
from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=100, verbose_name="文章标题")
    slug = models.SlugField(uniqe=True)
  • 定义视图
class ArticleDetailView(View):
    """文章详情视图"""

    def get(self, request, slug):
        # 查询指定slug对应的文章
        article = Article.objects.filter(slug=slug).first()
        data = {
            'title': article.title,
            'slug': article.slug
        }
        return JsonResponse({"data": data})
  • 定义路由
path("article/<slug: slug>/",ArticleDetailView.as_view())

至此,简单slug从定义到使用全部说完了

进阶用法

其实在Django中为了方便生成slugDjango为我们提供了一个方法slugify

from django.template.defaultfilters import slugify

slugify("hello word")
> "hello-word"
slugify("测试")
> ""

可以看到,自带的slugify是不支持中文的,这样我们就需要使用一个叫django-uuslug的包

pip install django-uuslug
from uuslug import slugify

slugify("hello word")
> "hello-word"
slugify("测试")
> "ce-shi"

这样的话我们就可以将以上定义的模型改为

from django.db import models
from uuslug import slugify


class Article(models.Model):
    title = models.CharField(max_length=100, verbose_name="文章标题")
    slug = models.SlugField(uniqe=True)

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

我们也可以将我们视图改为

from django.views import generic


class ArticleDetailView(generic.DetailView):
    model = Article
    template_name = "detail.html"
    context_object_name = "article"

此视图将会返回一个名为articleArticle对象

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.ltfred.com/article/django-slug/