Форма заявки (пример)
Форма заявки (пример)
Категория: Разработка Теги: Веб-разработка Опубликовано: 10 января 2021

Django автоматическое заполнение поля в модели при её создании

Появилась необходимость заполнить поле с номером заявки до формирования формы, связанной с моделью, но как это сделать? В интернете много способов, и нет ни одного рабочего! Я догадался сам, сейчас расскажу вам, как это сделать при помощи отдельной функции.

Для начала уточню, что присвоить номер необходимо не просто до формирования формы, а даже до сохранения объекта модели. 

Как сделать уникальный номер заявки, если нет доступа к id/pk? Ведь форма еще не сформирована, и, соответственно, объект будет сохранен только после нажатия кнопки "добавить в форме". До этого момента id/pk недоступен. Говорят, есть функция uuid, но в обнаруженных ответах примеров не было, и я всё-таки допилил свой способ.

При объявлении поля модели можно задать параметр default и в нем указать функцию:

number = models.CharField(max_length=20, unique=True, default=func, verbose_name='Номер заявки')

CharField мне в конкретном случае более удобен, а так можно использовать IntegerField.

verbose_name указывает имя, которое используется в качестве названия в админке и в названии поля в сформированной форме.

unique указывает, должно ли значение данного поля быть уникальным.

max_length - максимальная длина.

default - значение по умолчанию.

Так вот, в параметре default можно указать функцию для вычисления номера для новой заявки.

Функцию необходимо объявить до объявления класса модели и использовать в ней return, и да, никаких параметров self. Вот пример:

def func():
    nm = Req.objects.all()
    nm1 = 1
    for i1 in nm:
        if i1.id > nm1:
            nm1 = i1.id
    nm1 = nm1 + 1
    nn = '000' + str(nm1)
    return nn

Способ до гениальности простой, можно без труда переделать под себя.

Алексей Черемных
6452