Django字母数字CharField

JMi*_*ira 4 django django-models

如何在只能有数字和字母的Django模型上创建CharField?

models.CharField(_('name'), max_length=50, null=False, blank=False)
Run Code Online (Sandbox Code Playgroud)

Jer*_*zyk 6

另一种选择是使用validatorsCharField选项(docs)


小智 5

模型级别的控制可能包括一些不需要的行为,这些行为等同于模式约束,并且在操作数据库时应用(即:备份),如果您完全确定需要在模型级别而不是表单上进行控制,那么您应该定义一个新的验证者或使用现有的验证者.

测试字母数字字符串的基本方法是

'string'.isalpha()
Run Code Online (Sandbox Code Playgroud)

您可以将该评估放在模型的save方法中,但如果您想要更多控制或自动引发ValidationError,您可以为模型定义验证器.这样你就可以在不涉及表格的情况下进行单元测试.但是,请确保您的实施不会影响您的表现.

例:

"自动化任务从远程服务器获取hex32令牌",因此您可以在运行时使用以下验证器检查这些令牌:

RegexValidator(r'^[A-Fa-f0-9]{32}$',
               message='Key must be Hex len 32',
               code='Invalid Key')
Run Code Online (Sandbox Code Playgroud)

如果它不匹配,则自动引发ValidationError及其详细信息.

在你的情况下,你可以这样做:

models.py:

from validators import isalphavalidator

class SomeModel(Model):
    some_alpha_field = models.CharField(_('name'), validators=[isalphavalidator], max_length=50, null=False, blank=False)
Run Code Online (Sandbox Code Playgroud)

validators.py

from django.core.validators import RegexValidator


'''
This regex assumes that you have a clean string,
you should clean the string for spaces and other characters
'''

isalphavalidator = RegexValidator(r'^[\w]*$',
                             message='name must be alphanumeric',
                             code='Invalid name')
Run Code Online (Sandbox Code Playgroud)