Джанго выпуска
Я в тупике. У меня есть пользовательский класс поля модели, который ищет два аргумента: app_name и file_dir.
В моем определении модели у меня есть это:
files = MultiFileUploadAndViewer(app_name = getAppName(), file_dir='RequestedFiles', blank=True)
getAppName () - это:
#appconfig imported from apps.py
def getAppName():
return <appConfig>.name
И определение пользовательского поля:
class MultiFileUploadAndViewer(models.FilePathField):
def __init__(self, *args, **kwargs):
print(kwargs['app_name'])
self.app_name = kwargs.pop('app_name')
self.file_dir = kwargs.pop('file_dir','') + '\\'
self.path = MEDIA_ROOT + '\\' + self.app_name + '\\' + self.file_dir
self.upload_url = reverse(self.app_name +':File Upload') + '\\' + self.file_dir
kwargs.update({'path':self.path})
super(MultiFileUploadAndViewer, self).__init__(*args, **kwargs)
Я удалил все в папке миграций, кроме init.py.
После запуска makemigrations он выдает KeyError с жалобой на то, что app_name отсутствует в kwargs.
Однако обратите внимание на вызов print() в методе полей init. Это успешно печатает имя_приложения. KeyError приходит после. Функция init вызывается дважды или как? Таким образом, выдает ошибку после того, как 'app_name выскочило из kwargs? Как я могу решить эту проблему? Если я предоставляю значение по умолчанию для app_name в методе pop(), это работает, но я хочу, чтобы он выдавал ошибку, если app_name (или file_dir) отсутствуют в kwargs.
1 ответ
Метод init снова вызывается моделями суперкласса.FilePathField здесь:
super(MultiFileUploadAndViewer, self).__init__(*args, **kwargs)
И вы удаляете имя приложения kwargs здесь
self.app_name = kwargs.pop('app_name')