在 Django 中验证 slug

Posted

技术标签:

【中文标题】在 Django 中验证 slug【英文标题】:Validating a slug in Django 【发布时间】:2010-10-30 18:54:45 【问题描述】:

我猜这将涉及正则表达式或其他东西,但我会试一试。此时,用户可以通过在标题字段中键入类似于 £$(*£$(£@$&£($ 的内容来破坏网站,使用 Django slugify 将其转换为 slug。

因为这些字符都不能转换,Django 返回一个错误。我的问题是,当用户使用这样的标题时,我应该在表单验证方法中添加什么来引发forms.ValidationError

谢谢。

【问题讨论】:

【参考方案1】:

这个问题已经有五年历史了,所以在更新我的问题时,我应该解释一下,我至少是在向过去点头致意,过去某些功能可能不存在。

如今处理表单中的 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 的蛞蝓想法中,如果 Django 有一天真的改变了,你将确保一致性。

【讨论】:

似乎有效。非常感谢队友。在 clean_field 方法中: if re.match("[a-zA-Z0-9]+", potential_slug) == None: raise forms.ValidationError("The title is not sluggable.") 这个正则表达式不考虑在 slug 中非常常见的连字符“-”的使用。此外, \d 是多余的,因为 \w 也涵盖了数字。下面本的回答更正确。 Ben 下面的回答更正确。 [a-zA-Z0-9]+ 既不匹配下划线也不匹配连字符,[\w\d]+ 匹配下划线但不匹配连字符。 好吧,我只花了几年时间来改进答案。我认为它现在应该涵盖大多数人的保留。【参考方案2】:
SLUG_REGEX = re.compile('^[-\w]+$')

【讨论】:

我相信这个正则表达式比 Oli 的更好,因为它允许你的 slug 包含“-”。

以上是关于在 Django 中验证 slug的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用 JWT 进行身份验证

python 如果对象存在,Django会在视图中验证/验证

在 Django 中验证 slug

是否可以在 django rest 框架序列化程序中使用重用 django 表单进行验证?

如何在Django中为SQLServer数据库创建身份验证系统?

无法在 django 的内置身份验证应用程序中删除用户