Модель Django - установка по умолчанию charfield в нижнем регистре

Как установить по умолчанию charfield в нижнем регистре? Это моя модель:

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=64)
    name = models.CharField(max_length=200)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=200)

    def __init__(self, *args, **kwargs):
        self.username = self.username.lower()

Я попробовал __init__, но он не работает. Я хочу сделать имя пользователя в нижнем регистре каждый раз, когда будет сохранена новая запись. Спасибо.

Ответ 1

Просто сделайте это в методе сохранения. т.е. переопределить метод save класса Model.

def save(self, *args, **kwargs):
    self.username = self.username.lower()
    return super(User, self).save(*args, **kwargs)

Ответ 2

При перезаписи метод save() является допустимым решением. Я нашел полезным иметь дело с этим на уровне Field а не на уровне Model, переписав get_prep_value().

Таким образом, если вы когда-нибудь захотите повторно использовать это поле в другой модели, вы можете использовать ту же самую последовательную стратегию. Также логика отделена от метода сохранения, который вы также можете перезаписать для разных целей.

Для этого случая вы бы сделали это:

class NameField(models.CharField):
    def __init__(self, *args, **kwargs):
        super(NameField, self).__init__(*args, **kwargs)

    def get_prep_value(self, value):
        return str(value).lower()

class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    password = models.CharField(max_length=64)
    name = NameField(max_length=200)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=200)

Ответ 3

def save(self, force_insert=False, force_update=False):
        self.YourFildName = self.YourFildName.upper()
        super(YourFomrName, self).save(force_insert, force_update)