Django slugField

Author: xcluo
Date: 2013-01-17 09:28
Keywords:  django , slug, generate a URL, 
Title: What is a "Slug" in  Django ?

slug 翻译过来就是, 标称, 单位的意思, 在 django 中, 主要是生成一个URL路径, 在你已有的有效数据下。

通俗来将: Django 中的Slug会为每条model记录,自动(当然可以手动)的根据当前记录的每个字段的Value生成一个URL路径(唯一的),使得你的URL更加的易读(或者也能规避一些额外的问题)。

举例说明:
class Article():
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)
上面是一个 Django 的Model, 包含三个字段, 最后一个是Slug 字段, 一般的, 我们想显示一篇 Article, 常用的方式可能是:

www.example.com/article/3/
www.example.com/a_id/3/  ......

Problem is: Maybe disclose your database ident
或者,会弱化你的URL可读性, 你可能会希望你的URL能使用title字段或content字段的部分内容来构建起来:

www.example.com/article/America attack on Iraq

这个也有问题, 就是URL 不能识别出空格, 真实的路径会变成:

www.example.com/article/America%20attack%20on%20Iraq

在你其他地方,会变的无法识别, 你就需要将这个空白符进行转义,比如这样:
www.example.com/article/America-attack-on-Iraq

OK, 这个过程就是 "Slug"。

怎么用呢?

在模型中, 简单, 只需要在模型中加上一个字段就可以了。 如何在views中或tempalte中,如何使用呢?

首先考虑到自动方式, 需要更改模型:
class Article():
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)
    
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Article, self).save(*args, **kwargs)
飞自动的方式, 例如:

>>> from django.template.defaultfilters import slugify
>>> tt = slugify("b b b b")
u'b-b-b-b'
>>> models.Articel(title='', contents='', slug=tt).save()

模版中, 就可以当一个数据记录直接调用, 并附件到你的跳转/link路径上
<think>好的,用户想了解如何在Django中创建和使用模型。之前的历史对话中,用户可能已经问了退出虚拟环境的问题,但现在转向了Django模型。根据用户提供的引用,我需要整合这些信息来给出清晰的步骤。 首先,引用[1]提到创建Django模型需要导入必要的模块,比如models、slugify、User和reverse。引用[3]展示了如何定义模型字段和使用create()方法创建实例。引用[2]讨论了索引的创建,引用[4]涉及Admin的使用。我需要将这些内容组织成步骤,涵盖模型定义、字段类型、Meta选项、Admin注册等。 用户的问题包括创建和使用模型,所以需要分步骤说明。可能需要从创建模型开始,到字段类型选择,添加方法,创建实例,数据库迁移,Admin配置,以及查询和索引优化。还要注意代码示例的正确性,比如使用正确的导入和语法。 同时,用户可能作为刚接触Django的开发者,需要详细但不过于复杂的解释。要确保每个步骤都有示例代码,并说明每个部分的作用,比如Meta类中的ordering或verbose_name。还要注意常见问题,比如blank和null的区别,以及Admin的注册方法。 最后,生成相关问题时要参考之前的引用,比如索引优化、Admin定制、slug生成等。确保回答结构清晰,符合用户之前的问题格式,使用适当的引用标记。</think>### 如何在Django中创建和使用模型 #### 一、创建Django模型基础步骤 1. **在`models.py`中定义模型类** ```python from django.db import models from django.contrib.auth.models import User from django.urls import reverse from django.template.defaultfilters import slugify class Article(models.Model): # 基础字段定义 title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) slug = models.SlugField(unique=True) # 自动生成slug的覆盖保存方法 def save(self, *args, **kwargs): self.slug = slugify(self.title) super().save(*args, **kwargs) # 定义对象显示格式 def __str__(self): return self.title # 自定义元数据 class Meta: ordering = ['-created_at'] verbose_name = '技术文章' indexes = [ models.Index(fields=['created_at'], name='create_time_idx') # 索引优化[^2] ] ``` #### 二、核心组件说明 1. **常用字段类型** - `CharField`: 短文本(必须指定`max_length`) - `TextField`: 长文本内容 - `DateTimeField`: 时间日期(`auto_now_add`自动记录创建时间) - `ForeignKey`: 外键关联(如用户与文章的1:N关系) - `SlugField`: SEO友好URL标识符 2. **字段参数规范** ```python title = models.CharField( max_length=200, verbose_name='文章标题', help_text='请输入不超过200字的标题', blank=False, # 必填字段 null=False # 数据库非空约束 ) ``` #### 三、模型使用实践 1. **创建模型实例** ```python # 方法1:create()直接创建[^3] new_article = Article.objects.create( title="Django模型指南", content="详细模型使用说明...", author=request.user ) # 方法2:分步创建保存 article = Article(title="ORM进阶") article.author = User.objects.get(username='admin') article.save() ``` 2. **数据库迁移操作** ```bash python manage.py makemigrations # 生成迁移文件 python manage.py migrate # 执行数据库变更 ``` 3. **Admin后台配置**(需在`admin.py`注册)[^4] ```python from django.contrib import admin from .models import Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'author', 'created_at') search_fields = ('title', 'content') list_filter = ('created_at', 'author') ``` #### 四、关联功能开发 1. **URL反向解析** ```python def get_absolute_url(self): return reverse('article_detail', args=[str(self.slug)]) ``` 2. **数据查询示例** ```python # 获取最近5篇文章 recent_articles = Article.objects.all().order_by('-created_at')[:5] # 过滤特定作者的文章 user_articles = Article.objects.filter(author__username='admin') ``` [^1]: 模型定义需继承`django.db.models.Model`基类,字段定义决定数据库表结构 [^2]: 通过`Meta.indexes`可添加数据库索引提升查询性能 [^3]: `create()`方法会自动执行模型验证并保存到数据库 [^4]: Admin后台注册后可通过`/admin`访问进行数据管理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值