Django字母数字CharField

时间:2011-03-25 20:49:01

标签: django django-models

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

models.CharField(_('name'), max_length=50, null=False, blank=False)

4 个答案:

答案 0 :(得分:6)

另一种选择是对CharField使用validators选项(docs

答案 1 :(得分:5)

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

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

'string'.isalpha()

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

实施例

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

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

如果它不匹配,则自动引发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)

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')

答案 2 :(得分:3)

不要使用CharField使用RegexField代替regex="[A-z0-9]+"

您可以使用相同的逻辑使该字段变得简单:

class AlphaNumericField(CharField):
    def clean(self, value, model_instance):
        value = super(AlphaNumericField, self).clean(value, model_instance)
        if not re.match(r'[A-z0-9]+', value):
            raise ValidationError('AlphaNumeric characters only.')
        return value

答案 3 :(得分:0)

而不是 RegexValidator ,只在表单属性中提供验证,例如......

        *class StaffDetailsForm(forms.ModelForm):
             first_name = forms.CharField(required=True,widget=forms.TextInput(attrs={'class':'form-control' , 'autocomplete': 'off','pattern':'[A-Za-z ]+', 'title':'Enter Characters Only '}))*

依旧......

如果您使用 RegexValidator ,则必须处理视图中的错误。 它对我有用,试试这个简单的方法...... 这将允许用户仅输入字母和空格