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

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

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

谢谢。

【问题讨论】:

    标签: python django validation slug


    【解决方案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 包含“-”。
    猜你喜欢
    • 2012-02-09
    • 2017-11-19
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多