python - 如何使模型中的整数字段固定为十个数字输出

标签 python django python-3.x django-models

我希望用户输入10位数字的电话号码,如何设置整数字段“phone_no”来实现它?

我已将其设置为默认值,但我想检查数字输入:

模型.py

class Documents(models.Model):
    docs_name = models.CharField(max_length=200,verbose_name="Names in Documents")
    item_type = models.CharField(default="", max_length=100,
                             help_text='*Enter the item name you found e.g. Marksheet,key,wallet',verbose_name="Item type" )
    police_station = models.CharField(max_length=255, help_text='*Enter the police station you sending the docs', verbose_name="Police station")
    phone_no = models.IntegerField(default=0, verbose_name="Phone number")
    date = models.DateTimeField(default=timezone.now,verbose_name="Date")
    Description = models.TextField(blank=True, null=True, help_text='*Enter full description about item',verbose_name="Description")
    pay_no = models.IntegerField(default=0,verbose_name="payment number")
    publish = models.BooleanField(default=False)

    image = models.ImageField(default="add Item image",
                          upload_to="DocsImage",blank=False, verbose_name="Images")


"""docstring for Documents"""
def __str__(self):
    return self.docs_name

最佳答案

您可以使用 validators 来实现此目的。它们是函数(或任何可调用函数),您可以将其插入 Field 声明中以检查某些条件。

首先,在这种情况下,您应该使用 models.CharField(verbose_name="Phone number"...) 来存储电话号码,以防它们以 0 开头。

接下来我们必须执行测试来检查该值是否仅包含数字,并且仅包含 10。

选项 1:自定义验证器

第一种方法是自己创建验证器,以便运行您想要的测试:

  • 创建在测试失败时将引发错误的函数:

    def validate_digit_length(phone):
        if not (phone.isdigit() and len(phone) == 10):    
            raise ValidationError('%(phone)s must be 10 digits', params={'phone': phone},)
    

    您可以将此函数存储在模型旁边,或存储在单独的文件中并导入。

  • 然后将此函数插入​​字段声明中的参数validators(类型列表):

    phone_no = models.CharField(verbose_name="Phone number", max_length=10,  
        validators=[validate_digit_length], default='1234567890')
    

选项 2:使用内置验证器

您还可以在 django 中找到 built-in validators,适用于所有通用情况。

使用此 Charfield phone_nomax_length 参数将检查最大大小,因此我们需要检查最小大小 (10) 以及字符是否为数字。我们可以通过 MinLengthValidatorint_list_validator 来实现这一点:

from django.core.validators import MinLengthValidator, int_list_validator

phone_no = models.CharField(verbose_name="Phone number", max_length=10,
    validators=[int_list_validator(sep=''),MinLengthValidator(10),], 
    default='1234567890')
<小时/>

另一个探索链接:
What's the best way to store Phone number in Django models

关于python - 如何使模型中的整数字段固定为十个数字输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57131043/

相关文章:

Python Matplotlib : "ImportError: cannot import name flatten"

python - ctypes:使用 lib.so(在 Mac 上)时指针地址修改,但在使用 lib.dll(在 Windows 上)时不修改

python - 关闭 Django 开发服务器上的模型验证

python - 如何计算Python中的单词数达到限制?

Python在DNA序列中找到最长的ORF

python - 在 Mako 模板中使用字典

jquery 无法从 CDN 与 django 模板一起工作

python - 具有大对象的 Memcached(NetworkX 图)

python - 调试 ansible 跟踪以查找 python 云堆栈模块中可能存在的错误

python - python 中的协程在 3.4 和 3.5 之间,如何保持向后兼容性?