2012-02-08 12 views
3

私は現在、Djangoテンプレートテンプレートタグを書いています。例えば、settings.MIDDLEWARE_CLASSESのように、文字列を使ってそのクラスを参照できるようにしたいと考えています。タグは{% mytag "myproject.lib.mymodule.SomeClass" %}のようになります。Pythonパス文字列をDjangoで解決するにはどうすればよいですか?

質問はかなり簡単です:私のテンプレートタグで、この文字列を実際に参照されているクラスに簡単に解決する方法はありますか?

ありがとうございました。

+0

答えは "イエス" です。今。あなたが本当に知っているべきこと**を質問するために質問を編集してください。「クラス名をクラスオブジェクトに変換するにはどうすればいいですか?」それから、「なぜあなたはこれをやろうとしているのですか?」と聞くことができます。しばしば、あなたは他の技術でもっと幸せになるでしょう。引数として指定されたクラスオブジェクトでタグが何をするかを説明してください。 –

+0

私は、これが何かをする最善の方法であるかどうかにかかわらず、これがどのように行われているかを見ることに興味があります。 –

+0

ありがとう。質問は純粋に技術的なものであり、テンプレートタグではなく、多くの場所で役立つ可能性があります。しかし、興味がある人は、[FacebookのBigPipe](http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919)のようなものを作成することが目標です)。タグは、Pageletクラスパスを引数として取り、それを遅延レンダリングに登録し、必要に応じて最後にプレースホルダを返します。 – Pierre

答えて

1

実際に文字列として指定したパッケージをインポートする必要がある場合は、__import__ functionをチェックアウトする必要があります。

基本的な使い方は、あなたがS.Lottが述べたように、あなたが必要とする、しかし

import myproject.lib.mymodule.SomeClass as my_class 

と同等です

my_class = __import__("myproject.lib.mymodule.SomeClass") 

のような文字列で指定されたパッケージをインポートしようとすることができますということですそれが本当に問題を解決する最良の方法であるかどうかを慎重に検討する必要があります。

+0

ありがとう!私は他の多くのオプションを考慮しましたが、これは本当に最も柔軟性があるようです。 – Pierre

+0

ちょうどその解決策は実際には機能しないと付け加えて、私は少しのrsplitマジックと '__import__'関数の' fromlist'引数を必要としました。私は実際に正しい答えを見つけるために[この質問](http://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class)を読んでいます。 – Pierre

1

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') 
関連する問題