django 自动设置 SlugField 字段
首先我们要了解 django 字段类型 SlugField,SlugField 是一个新闻术语(通常叫做短标题)。一个 slug 只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在地址栏的 URL 里的。像 CharField 一样,你可以指定 max_length(也请参阅该部分中的有关数据库可移植性的说明和 max_length)。如果没有指定 max_length, Django 将会默认长度为 50。
我本来是用 pypinyin 在 model save 时自动填充:
from django.db import models
from pypinyin import lazy_pinyin
class Category(models.Model):
"""
节点类别表
"""
name = models.CharField(max_length=128, unique=True, verbose_name="类别名称")
slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
def save(self, *args, **kwargs):
self.slug = slugify("-".join(lazy_pinyin(self.name)))
super(Category, self).save(*args, **kwargs)
class Meta:
verbose_name = "节点类别"
verbose_name_plural = "节点类别列表"
def __str__(self):
return self.name
最近发现已经有轮子 django-autoslug 干了这事:
Django-autoslug is a reusable Django library that provides an improved slug field which can automatically:
- populate itself from another field,
- preserve uniqueness of the value and
- use custom slugify() functions for better i18n.
The field is highly configurable.
Requirements
Python 2.7, 3.5+, or PyPy.
Django 1.7.10 or higher.
It may be possible to successfully use django-autoslug in other environments but they are not tested.
Note
PyPy3 is not officially supported only because there were some problems with permissions and __pycache__ on CI unrelated to django-autoslug itself.
Examples
A simple example:
from django.db.models import CharField, Model
from autoslug import AutoSlugField
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
More complex example:
from django.db.models import CharField, DateField, ForeignKey, Model
from django.contrib.auth.models import User
from autoslug import AutoSlugField
class Article(Model):
title = CharField(max_length=200)
pub_date = DateField(auto_now_add=True)
author = ForeignKey(User)
slug = AutoSlugField(populate_from=lambda instance: instance.title,
unique_with=['author__name', 'pub_date__month'],
slugify=lambda value: value.replace(' ','-'))
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的