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
Способ до гениальности простой, можно без труда переделать под себя.