Как Django Createsuperuser знает, как разбирать мое поле даты - PullRequest
1 голос
/ 26 мая 2020

Я создал настраиваемый модуль User, который добавляет несколько дополнительных полей:

class User(AbstractUser):
    """User modle for staff, clients and customers"""

    username = None # remove username from the model

    email = models.EmailField("email address", unique=True)
    # """Email of user this will be used for login"""
    address = models.OneToOneField(Address, on_delete = models.PROTECT, null=True, blank=True)
    """:class:`Postal Address` associated with the User"""
    birth_date = models.DateField()
    """Date of birth of User"""
    phone = models.CharField(max_length=15)
    """Phone number of User"""
    org = models.ForeignKey(Organization, on_delete=models.PROTECT, null=True, blank=True)
    """:class:`Organization` User is associated with"""

    # changes for using email instead of username
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'birth_date', 'phone']
    objects = UserManager()
    def __str__(self):
        return F"{self.email} {self.first_name} {self.last_name}"

Когда я запускал команду createsuperuser, она запрашивала Birth_date (и знал, как разбирать Это). Я ввел 2020-01-01 в качестве значения.

Любопытно, я затем временно поместил эти операторы в функцию createsuperuser:

print("*****")
print(extra_fields)
print("*****")```

и получил:

{'first_name': 'super', 'last_name': 'user', 'birth_date': datetime.date(2020, 1, 1), 'phone': '12345', 'is_staff': True, 'is_superuser': True, 'is_active': True}

Как он узнал, что использовать datetime.date и как его правильно разобрать?

Что еще более важно, как я могу сделать подобное поведение для настраиваемого связанного объекта?

1 Ответ

0 голосов
/ 26 мая 2020

Как он узнал, что использовать datetime.date и как правильно его проанализировать?

Он знает, что это дата, потому что birth_date является объектом DateField().

Что касается формата, он использует форматы в порядке, определенном в настройке DATE_INPUT_FORMAT [Django -doc] . По умолчанию это:

[
    <b>'%Y-%m-%d'</b>, '%m/%d/%Y', '%m/%d/%y', # <b>'2006-10-25'</b>, '10/25/2006', '10/25/06'
    '%b %d %Y', '%b %d, %Y',            # 'Oct 25 2006', 'Oct 25, 2006'
    '%d %b %Y', '%d %b, %Y',            # '25 Oct 2006', '25 Oct, 2006'
    '%B %d %Y', '%B %d, %Y',            # 'October 25 2006', 'October 25, 2006'
    '%d %B %Y', '%d %B, %Y',            # '25 October 2006', '25 October, 2006'
]

Итак, здесь первый формат совпадает. Если это приводит к ошибке при синтаксическом анализе, выполняется переход к следующему, et c. до тех пор, пока один из форматов не примет ввод или список не будет исчерпан, и в этом случае он не сможет проанализировать строку даты.

Вы можете изменить настройку, чтобы использовать свои собственные форматы, или изменить чтобы сделать один формат более предпочтительным по сравнению с другим. Это может быть важно, поскольку 2020-05-06 можно анализировать как 6 мая или 5 июня. Поэтому, если вы добавите формат %Y-%d-%m перед списком, он будет проанализирован по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...