在 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的主要内容,如果未能解决你的问题,请参考以下文章
python 如果对象存在,Django会在视图中验证/验证
是否可以在 django rest 框架序列化程序中使用重用 django 表单进行验证?