2016-12-27 37 views
1

我正在嘗試編寫一些代碼來在我的django項目中動態地導入「類似插件」的應用程序。我使用Django 1.10在Django中動態導入url給'str'對象不可調用

我子類的django.apps.AppConfig類,並用它來標記插件:

from django.apps import AppConfig 
class AutomationAppConfig(AppConfig): 
    def get_url(self): 
     return self.name 

然後,在我的項目主要urls.py我加入這個代碼的主「靜」 URL模式後initializazion:

... 

from slae.util import AutomationAppConfig 
from django.apps import apps 

for module in iter(apps.get_app_configs()): 
    if isinstance(module, AutomationAppConfig): 
     url = module.get_url() 
     urlpatterns.append(url(r'^%s/' % url, include('%s.urls' % module.name), name = module.name)) 

,但它提供了以下錯誤當服務器(重新)加載

... 
File "/cygdrive/d/workspaces/non-ide/slae/slae/urls.py", line 47, in <module> 
urlpatterns.append(url(r'^%s/' % url, include('%s.urls' % module.name), name = module.name)) 
TypeError: 'str' object is not callable 

我不明白的是,使用這個代碼,而不是它工作正常:

from slae.util import AutomationAppConfig 
from . import settings 
from django.utils.module_loading import import_string 
import inspect 

for app in settings.INSTALLED_APPS: 
    try: 
     module = import_string(app) 
    except: 
     pass 
    else: 
     if inspect.isclass(module) and issubclass(module, AutomationAppConfig): 
      urlpatterns.append(url(r'^%s/' % module.name, include('%s.urls' % module.name), name = module.name)) 

我缺少什麼?

回答

2

url是在from django.conf.urls中定義的函數。但是,代碼中的以下行會覆蓋此變量並在其中存儲字符串。

url = module.get_url() 

改變這個變量來別的東西,如:

url_route = module.get_url() 
urlpatterns.append(url(r'^%s/' % url_route, include('%s.urls' % module.name), name = module.name)) 
+0

謝謝!我確定這是微不足道的,我只是看不到它......我覺得愚蠢的XD – Antiphon0x