Джанго выпуска

Я в тупике. У меня есть пользовательский класс поля модели, который ищет два аргумента: 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')
Другие вопросы по тегам