2011-01-22 5 views
0

私はdjangoでPythonモジュールを動的にインポートしようとしています。私はからインポートする二つの異なるアプリケーションを持っている、と私は、これらのimport文を交換したい:Django - 動的にインポートする

from app1.forms import App1ProfileForm 
from app2.forms import App2ProfileForm 

は私が動的に文字列App1ProfileFormとApp2ProfileFormを作成し、そのようにそれらをインスタンス化することができる午前:

globals()[form]() 

私はこの記事では、命令の一部、以下試してみました:Dynamically import class by name for static access

ので、私はこれをやってみました:

theModule = __import__("app1.forms.App1ProfileForm") 

が、私は何のモジュールが

App1ProfileForm

命名ないというエラーEDIT ::: [OK]を を取得しています私はこのコードを試してみました:

theModule = __import__("app1") 
    print theModule 
    theClass = getattr(theModule,'forms') 
    print theClass 
    theForm = getattr(theClass,'App1ProfileForm') 
    print theForm 
    theForm.initialize() 

を私はエラーその型のオブジェクトを取得する「App1ProfileForm」 'initialize'属性がありません

+0

'theForm'は、クラスです。私はあなたがそれをインスタンス化したい、それを使用しないと思います。 'theForm()。initialize()'のようなものを試してみてください。 – pkoch

答えて

0

は、私はそれを考え出しました。ここでそれを行う方法は次のとおりです。その後、

theModule = __import__(module_name+".forms") # for some reason need the .forms part 
    theClass = getattr(theModule,'forms') 
    theForm = getattr(theClass,form_name) 

初期化する:

theForm() or theForm(request.POST) 
+0

あああまり動作しません...一度輸入品を取り出すと – JPC

+0

が動作します。なぜ私は.formsの部分が必要なのか分かりません。 – JPC

1

インポートする文字列をどのように生成しているのかよくわかりません。私はあなたが全体の "パス"を生成すると仮定します。これを試してみてください:

 
def import_from_strings(paths): 
    ret = [] 
    for path in paths: 
    module_name, class_name = path.rsplit('.', 1) 
    module = __import__(module_name, globals(), locals(), [class_name], -1) 
    ret.append(getattr(module, class_name)) 
    return ret 
+0

ここで 'paths'はどこに定義されていますか? – kelloti

+0

これは関数の引数です。いいえ? 私はimport_from_strings(['readline.get_history_length'、 'readline.get_line_buffer'])を使ってテストしました – pkoch

+0

は私の投稿を編集しました – JPC

1

モジュールではなくクラスをインポートしようとしていませんか?私はエキスパートではありませんが、__import__を使用してモジュールをインポートし、次にyourmodule.App1ProfileFormなどのApp1ProfileFormクラスを選択する必要があると思います。

+0

これは近いです、私の新しい投稿を編集しました – JPC

3

あなたはこれをしたくありません。インポートは、関連するコードが最初に実行されたときに実行されます。モジュールレベルのインポートの場合、モジュール自体がインポートされます。要求の中の何か、あるいは他の実行時要素に依存して、あなたが望むクラスを決定するなら、これは動作しません。

代わりに、ちょうどそれらの両方をインポートし、あなたが必要があるかを選択するためのコードを取得する:

from app1.forms import App1ProfileForm 
from app2.forms import App2ProfileForm 

forms = {'app1': App1ProfileForm, 
     'app2': App2ProfileForm} 
relevant_form = forms[whatever_the_dependent_value_is] 
+1

また、 。 – pkoch

+0

私はアプリをより再利用可能にしようとしています。このアプリを別のプロジェクトで使用しようとすると、インポートを変更する必要があります。再利用可能性は何かを目指すものではありませんか? – JPC

関連する問題