Django表单Name字段验证:如何添加特殊字符与标点校验?
解决方案:在Django表单中禁止Name字段包含标点/特殊字符
你遇到的问题是Python的re模块默认不支持POSIX字符类(如[[:punct:]]),除非指定对应的匹配标志。下面提供两种可行的实现方案:
方案1:启用ASCII标志使用POSIX字符类
直接在正则匹配时添加re.ASCII标志,让[[:punct:]]生效,匹配ASCII范围内的所有标点符号:
import re from django.core.exceptions import ValidationError def clean_name(self): name = self.cleaned_data['name'] if re.search(r'\d', name): raise ValidationError('The name must not have numbers') if re.search(r'\s', name): raise ValidationError('The name must not have spaces') # 添加标点校验,指定re.ASCII标志 if re.search(r'[[:punct:]]', name, flags=re.ASCII): raise ValidationError('The name must not have punctuation or special characters') return name
方案2:显式定义标点符号范围(更兼容)
如果不想依赖标志,可以直接把所有需要禁止的标点符号列在正则表达式中,这些字符对应Pythonstring.punctuation中的内容,兼容性更强:
import re from django.core.exceptions import ValidationError def clean_name(self): name = self.cleaned_data['name'] if re.search(r'\d', name): raise ValidationError('The name must not have numbers') if re.search(r'\s', name): raise ValidationError('The name must not have spaces') # 显式匹配所有ASCII标点符号 if re.search(r'[!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]', name): raise ValidationError('The name must not have punctuation or special characters') return name
优化:合并校验逻辑(可选)
如果不需要分别提示不同的错误类型,可以把所有禁止的字符合并到一个正则表达式中,减少重复调用,提升效率:
import re from django.core.exceptions import ValidationError def clean_name(self): name = self.cleaned_data['name'] # 一次匹配数字、空格、标点中的任意一种 if re.search(r'[\d\s!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]', name): # 或者用POSIX版本:re.search(r'[\d\s[:punct:]]', name, flags=re.ASCII) raise ValidationError('The name must not contain numbers, spaces, punctuation or special characters') return name
内容的提问来源于stack exchange,提问作者Elliot13
相关产品推荐
相关产品推荐

