验证Django中的slug

use*_*170 7 python django validation slug

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

因为这些字符都不能转换,所以Django会返回错误.我的问题是,forms.ValidationError当用户使用这样的标题时,我应该在表单验证方法中提出什么?

谢谢.

Oli*_*Oli 14

这个问题已有五十年了,所以在更新我的问题时,我应该解释一下,我至少会对过去的某些特征可能不存在的过去点头.

如今处理表格中最简单的方法就是使用django.models.SlugField.它将为您验证自己,并暗示该字段是一个索引.

如果您没有在模型上使用它,您仍然可以挂钩SlugField使用的相同验证器:

from django.core.validators import validate_slug

slug = forms.CharField(..., validators=[validate_slug])
Run Code Online (Sandbox Code Playgroud)

如果您只想进行幕后检查或编写自己的验证器,可以使用类似的技术来引入Django对有效slug的定义.这只是上面使用的validate_slug编译的正则表达式:

from django.core.validators import slug_re

if slug_re.match(...):
    ...
Run Code Online (Sandbox Code Playgroud)

我无法想象它会改变,但是通过将自己锁定在Django关于slug的想法中,如果Django确实改变了一天,你将确保一致性.

  • 似乎工作.非常感谢.在clean_field方法中:如果re.match("[a-zA-Z0-9] +",potential_slug)== None:raise forms.ValidationError("标题不可缓慢.") (2认同)
  • 好吧,我花了几年时间才改进答案.我认为现在应该涵盖大多数人的预订. (2认同)

小智 12

SLUG_REGEX = re.compile('^[-\w]+$')
Run Code Online (Sandbox Code Playgroud)