用于格式化字段数据的自定义模型字段

时间:2014-05-18 08:29:43

标签: python django django-models

我希望有一个特定的模型字段,以1234-12345的格式处理factory_id。

因此,如果用户尝试添加仅XXXXXXXXXXXXX-XXXXX的工厂ID,它会自动将其作为XXXX-XXXXX自动存储在数据库中。
有人指出我从哪里开始的方向?

2 个答案:

答案 0 :(得分:1)

您可以使用Django's built-in Regex validatorfrom django.core.validators import RegexValidator

示例

factory_id = models.CharField(max_length=10, 
                              validators=[
                                  RegexValidator(r'^[0-9]{4}-{0,1}[0-9]{5}$')
                              ])

由于您要以XXXX-XXXXX格式保存字段。然后,您应该更改模型的save()方法。

def save(self, *args, **kwargs):
    if '-' not in self.factory_id:
        self.factory_id = '{0}-{1}'.format(self.factory_id[:4], self.factory_id[4:])
    super(MyModel, self).save(*args, **kwargs)

答案 1 :(得分:1)

正如@Rod Xavier所说,你可以使用RegexValidator。但是,更准确地说,使用正则表达式,您可以同时允许XXXX-XXXXXXXXXXXXXX,然后在使用短划线保存格式时(如果缺少)。如果条目不是9个字符长或10个字符没有短划线,RegexValidator将拒绝该字段,并且该对象不会被保存。

from django.core.validators import RegexValidator
from django.db import models 

class MyModel(models.Model):
    # Notice the ? in the regex.
    factory_id = models.CharField(max_length=10, 
                                  validators=[
                                      RegexValidator(r'^[0-9]{4}-?[0-9]{5}$')
                                  ])

    def save(self, *args, **kwargs):
        """ This step is just formatting: add the dash if missing """
        if '-' not in self.factory_id:
            self.factory_id = '{0}-{1}'.format(
                 self.factory_id[:4], self.factory_id[4:])

        # Continue the model saving
        super(MyModel, self).save(*args, **kwargs)