0

我难住了。我有一个自定义模型字段类,它查找两个参数: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 中。

但是,请注意字段init方法中对 print() 的调用。这成功打印了 app_name。KeyError 紧随其后。init函数是否被调用了两次?因此在 'app_name 从 kwargs 中弹出后抛出错误?我该如何解决这个问题?如果我在 pop() 方法中为 app_name 提供默认值,这可行,但我希望它在 kwargs 中不存在 app_name(或 file_dir)时出错。

4

1 回答 1

3

init 方法在这里被超类 models.FilePathField 再次调用:

super(MultiFileUploadAndViewer, self).__init__(*args, **kwargs)

你在这里删除 kwargs app_name

self.app_name = kwargs.pop('app_name')
于 2017-04-10T13:44:34.363 回答