Django - динамический импорт - PullRequest
       3

Django - динамический импорт

0 голосов
/ 22 января 2011

Я пытаюсь выполнить динамический импорт модуля python в django. У меня есть два разных приложения, из которых я хочу импортировать, и я хочу заменить эти операторы импорта:

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

Я могу динамически создавать строки App1ProfileForm и App2ProfileForm, а затем создавать их экземпляры следующим образом:

globals()[form]()

Я попытался выполнить некоторые инструкции в этом посте: Динамически импортировать класс по имени для статического доступа

и я попытался сделать это:

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

но я получаю сообщение об ошибке "Нет модуля с именем App1ProfileForm

EDIT ::: Хорошо, я попробовал этот код:

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

но я получаю ошибку, что у объекта типа 'App1ProfileForm' нет атрибута 'initialize'

Ответы [ 4 ]

3 голосов
/ 22 января 2011

Ты не хочешь этого делать.Импорт выполняется, когда соответствующий код выполняется впервые - в случае импорта на уровне модуля это происходит, когда импортируется сам модуль.Если вы зависите от чего-то в запросе или от другого элемента времени выполнения, чтобы определить, какой класс вам нужен, то это не сработает.

Вместо этого просто импортируйте их оба и получите код длявыберите тот, который вам нужен:

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

forms = {'app1': App1ProfileForm,
         'app2': App2ProfileForm}
relevant_form = forms[whatever_the_dependent_value_is]
1 голос
/ 22 января 2011

Вы не пытаетесь импортировать класс, а не модуль?Я не эксперт, но я думаю, что вы должны импортировать модуль с помощью __import__, а затем выбрать его класс App1ProfileForm с чем-то вроде yourmodule.App1ProfileForm

1 голос
/ 22 января 2011

Я не совсем понимаю, как вы генерируете строку для импорта. Я предполагаю, что вы генерируете весь «путь». Попробуйте это:

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 голосов
/ 22 января 2011

Я понял это.Вот как это сделать:

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...