我目前正在編寫一個Django模板模板標籤,並且希望能夠使用字符串引用其中的類,例如,在settings.MIDDLEWARE_CLASSES
中。標籤看起來像{% mytag "myproject.lib.mymodule.SomeClass" %}
。如何使用Django解析python路徑字符串?
的問題是相當簡單:在我的模板標籤,請問有什麼可以很容易地解決這個字符串實際引用的類?
謝謝。
我目前正在編寫一個Django模板模板標籤,並且希望能夠使用字符串引用其中的類,例如,在settings.MIDDLEWARE_CLASSES
中。標籤看起來像{% mytag "myproject.lib.mymodule.SomeClass" %}
。如何使用Django解析python路徑字符串?
的問題是相當簡單:在我的模板標籤,請問有什麼可以很容易地解決這個字符串實際引用的類?
謝謝。
如果你真的需要導入指定爲字符串一個包,你將需要檢查出__import__
function。
基本用法是,你可以嘗試導入該字符串中指定的包像
my_class = __import__("myproject.lib.mymodule.SomeClass")
這相當於
import myproject.lib.mymodule.SomeClass as my_class
然而,由於美國洛特提到的,你需要仔細考慮這是否是解決問題的最佳方法。
Django具有處理這種情況的一些實用功能。
在Django中1.7或更高,使用django.utils.module_loading.import_string
功能。
在Django 1.6中,使用django.utils.module_loading.import_by_path
函數。
(它看起來像存在import_by_path
1.5爲好,儘管它沒有記錄)
用法示例:
from django.utils.module_loading import import_string
my_class = import_string('myproject.lib.mymodule.SomeClass')
的答案是 「是」。現在。請編輯問題,詢問你真正需要知道的知識,即「如何將類名轉換爲類對象」。然後我們可以問:「你爲什麼要這麼做?」通常情況下,你會更喜歡其他技術。請解釋您的標記將用名爲參數的類對象做什麼。 – 2012-02-08 21:22:50
不管是否是最佳做事方式,我都會對看到這件事情感興趣 – 2012-02-08 21:34:05
謝謝。這個問題純粹是技術性的,可能在很多地方有用,不一定在模板標籤中。但如果你很好奇,目標是創造類似於[Facebook的BigPipe]的東西(http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919 )。該標籤將採用Pagelet類路徑作爲參數,將其註冊爲延遲呈現,並在必要時最終返回佔位符。 – Pierre 2012-02-08 21:46:14