Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何匹配a';单词';在django/python中使用正则表达式_Python_Regex_Django - Fatal编程技术网

如何匹配a';单词';在django/python中使用正则表达式

如何匹配a';单词';在django/python中使用正则表达式,python,regex,django,Python,Regex,Django,我使用的是Django/Python,我希望能够阻止用户使用这些词:“login”和“logout”作为他们的用户名。我目前的解决方案是使用正则表达式检查他们的输入是否包含禁止的单词(login、logout)。如果重要的话,我正在使用一个自定义的user\u模型,它是从AbstractBaseUser扩展而来的 #models.py username = models.CharField(max_length=14, blank=False, unique=True, validators=[

我使用的是Django/Python,我希望能够阻止用户使用这些词:“login”和“logout”作为他们的用户名。我目前的解决方案是使用正则表达式检查他们的输入是否包含禁止的单词(login、logout)。如果重要的话,我正在使用一个自定义的
user\u模型
,它是从
AbstractBaseUser
扩展而来的

#models.py
username = models.CharField(max_length=14, blank=False, unique=True,
validators=[
validators.RegexValidator(
re.compile('^[^:;\'\"<>!@#$%|\^&\*\(\)~`,.?/=\-\+\\\{\}]? [\w]+$'),
#the line below is my regex for finding the words
re.compile(r'\blogout\b'))],

#variations i've tried are
#re.compile('\bword\b')
#re.compile(r'\b[^word]\b')
#re.compile(r'\Blogout\B')
#re.compile(r"\b(logout)\b")
#re.compile(r'(\bword\b)')
#re.compile('\blogout\b' or '\blogin\b')
#re.compile(r'\b'+'logout'+'\b')
#re.compile(r'^logout\w+$' or r'\blogin\b', re.I)
#re.match(r'\blogout\b','logout') 
#etc...
error_messages={'required':
                    'Please provide a username.',
                    'invalid': 'Alphanumeric characters only',
                    'unique': 'Username is already taken.'},
)
但这对我来说并不理想。

您必须使其成为一个单独的验证器;您正在将第二个正则表达式作为消息传递到
RegexValidator()
对象中

只需使用一个验证值的简单函数;这里不需要正则表达式,而是要使值无效。编写只与负数匹配的正则表达式会变得复杂,而不是您想在此处执行的操作:

from django.core.exceptions import ValidationError

forbidden = {'login', 'logout'}

def not_forbidden(value):
    if value in forbidden:
        raise ValidationError(u'%s is not permitted as a username' % value)


username = models.CharField(max_length=14, blank=False, unique=True, validators=[
        validators.RegexValidator(r'^[^:;\'\"<>!@#$%|\^&\*\(\)~`,.?/=\-\+\\\{\}]? [\w]+$'),
        not_forbidden,
    ])
来自django.core.exceptions的
导入验证错误
禁止={'login','logout'}
def未禁用(值):
如果禁止输入值:
raise ValidationError(不允许u“%s”作为用户名“%s”值)
username=models.CharField(max_length=14,blank=False,unique=True,验证器=[
RegexValidator(r'^[^:;\'\'“!@$%\^&*\(\)~`,.?/=\-\+\\\{\}]?[\w]+$),
不被禁止,
])

请参阅。

为什么要将其作为
RegexValidator
构造函数的第二个参数传递?您所说的“对我来说并不理想”的解决方案甚至不起作用。如果在{login',logout'中清除['username'],则应该是
@iCodez该解决方案有效。但是,提交表单后将显示错误。我将发布整个代码。虽然我做了一个小更改,但您的解决方案正是我所需要的。我所做的更改是在函数中定义“dict”:def valid\u username(invalid\u username):#系统使用登录和注销,因此对用户名无效无效(无效)用户名={'login','logout'}如果无效(无效)用户名中的(无效)用户名:raise ValidationError(u'提供的用户名已被使用')
from django.core.exceptions import ValidationError

forbidden = {'login', 'logout'}

def not_forbidden(value):
    if value in forbidden:
        raise ValidationError(u'%s is not permitted as a username' % value)


username = models.CharField(max_length=14, blank=False, unique=True, validators=[
        validators.RegexValidator(r'^[^:;\'\"<>!@#$%|\^&\*\(\)~`,.?/=\-\+\\\{\}]? [\w]+$'),
        not_forbidden,
    ])