Я просто хотел добавить, что в будущем вы могли бы попытаться не включать такую бизнес-логику в форму модели. Хотя WoLpH является правильным и является прекрасным примером того, как обрабатывать дополнительную обработку экземпляра модели с помощью ModelForm
, конкретные случаи зависимости полей от данных других полей обрабатываются в Model
, Form
и ModelForm
API через их уважаемые clean()
методы и упоминается в нескольких местах в официальных справочных документах (вот один на формах , хотя то же самое относится и к Model
и ModelForm
API) .
В вашем случае это будет означать:
import os
class UploadFile(models.Model):
# ...
def clean(self):
# Field data has already been populated by this point.
# Note that `FieldFile` inherits from `File` and that
# `File.name` is actually the full path to the file
# so we need to get the base path component sans the extension
path, extension = os.path.splitext(self.thefile.file.name)
self.filename = os.path.basename(path)
И это все! Если вы правильно установите атрибут editable
в полях модели, вы обнаружите, что вы можете положиться на Django, чтобы автоматически генерировать ModelForm
для модели UploadFile
. Это означает, что вам не нужно определять ModelForm
для общего создания, обновления представлений или ModelAdmin
вашей модели, и это меньше строк кода для управления!
Общее практическое правило заключается в том, что вы дважды подумаете о том, является ли переопределенное поведение по умолчанию оправданным или автономным, особенно когда вы работаете в дальнем конце цепочки бизнес-логики, в противном случае вы можете почувствовать гнев неожиданных провалов.