2017-04-10 39 views
0

我很難過。我有一個自定義模型字段類,它查找兩個參數:app_name和file_dir。Django makemigrations問題

在我的模型定義我有這樣的:

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方法。這成功地打印了app_name。 KeyError在之後。函數被調用兩次或者其他東西?初始化函數被調用兩次?因此在'app_name 從kwargs彈出後拋出錯誤?我該如何解決這個問題?如果我在pop()方法中爲app_name提供了一個默認值,這可以工作,但如果app_name(或file_dir)不存在於kwargs中,我希望它錯誤。

回答

3

init方法是由超類models.FilePathField這裏再次呼籲:

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

而且要刪除的kwargs這裏APP_NAME

self.app_name = kwargs.pop('app_name') 
+0

哇,我有一個根本性的誤解是怎麼回事上。我認爲超級調用會運行超類'__init__? – DrS

+1

是的,這是做的,但沒有app_name和file_dir關鍵字參數,因爲你彈出它們 – lapinkoira

+0

我很困惑爲什麼FilePathField(超類)調用MultiFileUploadAndViewer(我的自定義子類)__init__。如果我不彈出kwargs,FilePathField會抱怨接收到意外的kwargs。 – DrS