在Django中验证slug

11 投票
2 回答
8458 浏览
提问于 2025-04-15 12:00

我猜这可能需要用到正则表达式或者其他什么东西,但我还是试试吧。现在,用户在网站的标题字段里输入类似于 £$(*£$(£@$&£($ 这样的内容,就会导致网站出问题,这些内容会被Django的 slugify 转换成一个“友好的”链接。

因为这些字符都无法被转换,所以Django会返回一个错误。我的问题是,我应该在表单验证的方法里加些什么,才能在用户使用这样的标题时抛出一个 forms.ValidationError 呢?

谢谢。

2 个回答

11

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后把它放到另一个地方。这个过程就像是把水从一个水桶倒到另一个水桶一样。

有些时候,我们会遇到一些问题,比如数据格式不对,或者数据不完整。这就像是你在倒水的时候,发现水桶有个洞,水流出去了一样。

为了避免这些问题,我们可以使用一些工具和方法来确保数据的安全和完整。比如,我们可以检查数据的格式,确保它符合要求,就像在倒水之前先检查水桶有没有破损。

总之,处理数据的时候,我们要小心谨慎,确保每一步都能顺利进行,这样才能得到我们想要的结果。

SLUG_REGEX = re.compile('^[-\w]+$')
19

这个问题已经有五年了,所以在更新我的问题时,我得提一下,过去的一些功能可能并不存在。

现在处理表单中的“slug”(通常是指一种简短的、易于阅读的字符串,用于表示某个对象的唯一标识)最简单的方法就是使用 django.models.SlugField。这个字段会自动帮你检查输入的内容,并且表示这个字段是一个索引。

如果你没有在模型中使用这个字段,你仍然可以使用和 SlugField 一样的验证器:

from django.core.validators import validate_slug

slug = forms.CharField(..., validators=[validate_slug])

如果你只是想在后台进行检查,或者自己写一个验证器,你可以用类似的方法来引入 Django 对有效 slug 的定义。其实就是上面 validate_slug 使用的那个编译好的正则表达式:

from django.core.validators import slug_re

if slug_re.match(...):
    ...

我想这个定义不会改变,但如果你坚持使用 Django 对 slug 的定义,就能确保在未来如果 Django 有所更改时,你的代码也能保持一致。

撰写回答