You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django:如何在models.py中阻止生成空Slug的表单保存?

解决Django中特殊字符导致Slug为空的问题

这个问题我之前也碰到过!核心原因是Django内置的slugify()函数在处理全特殊字符(比如???、%%)时,会把所有非字母数字的字符都过滤掉,最终生成空字符串。再加上你的get_unique_slug方法可能没处理空slug的边界情况,就导致空slug被意外保存到数据库了。

下面给你几个逐步解决的方案:

1. 完善get_unique_slug方法,强制生成非空唯一Slug

修改你的get_unique_slug函数,当slugify()返回空字符串时,自动生成一个带默认前缀的slug,确保永远不会出现空值:

from django.utils.text import slugify
import uuid

class Question(models.Model):
    question_text = models.CharField(max_length=250)
    slug = models.SlugField(max_length=255, unique=True)

    def get_unique_slug(self):
        # 尝试生成正常slug
        slug = slugify(self.question_text)
        
        # 如果slug为空,用默认前缀+随机字符串保证唯一性
        if not slug:
            # 用UUID前8位生成短且唯一的标识
            slug = f"question-{uuid.uuid4().hex[:8]}"
            return slug
        
        # 处理正常slug的重复问题
        unique_slug = slug
        num = 1
        while Question.objects.filter(slug=unique_slug).exists():
            unique_slug = f"{slug}-{num}"
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self.get_unique_slug()
        super().save(*args, **kwargs)

2. 模型层面添加验证,兜底防止空Slug

即使get_unique_slug处理了所有情况,也可以在模型的clean方法里加一层兜底验证,确保slug绝对不会为空:

from django.core.exceptions import ValidationError

# 在Question模型内添加
def clean(self):
    super().clean()
    if not self.slug:
        raise ValidationError("Slug 不能为空,请检查问题内容。")

3. 表单层面拦截无效输入(可选)

如果是通过表单提交问题,还可以从源头拦截仅含特殊字符的输入,避免后续生成空slug的麻烦:

from django import forms
from .models import Question
import re

class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = ['question_text']

    def clean_question_text(self):
        question_text = self.cleaned_data.get('question_text')
        # 检查内容是否包含至少一个字母或数字
        if not re.search(r'[a-zA-Z0-9]', question_text):
            raise forms.ValidationError("问题内容不能仅包含特殊字符,请输入有效内容。")
        return question_text

这样一套组合拳下来,不管用户输入什么特殊字符,要么被表单直接拦截,要么会生成一个非空的唯一slug,彻底解决空slug存入数据库的问题。

内容的提问来源于stack exchange,提问作者user9650228

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:01:23