Python 意外的导入行为

Python unexpected import behaviour

我正在尝试构建一个视图,其中基于表单 slug 动态加载表单,可用表单在这样的元组列表中定义,这是为了加快 [= 中新表单的开发44=]方式:

#installed_io.py
forms = [("json",JsonForm),("csv",CsvForm),....]

froms 像往常一样在 forms.py 模块中定义。

from django import forms

class FileForm(BaseDatasetForm):
    file = forms.FileField(label="Opcion 1: Seleccione un archivo", required=False)
    text = forms.CharField(widget=forms.Textarea, label="Opction 2: Introduzca el contenido en este campo", required=False)

utils.py 定义动态 select 表单的函数 class:

from installed_io import installed_inputs    

def get_input_form(slug):
    for entry in installed_inputs:
        if entry[0] == slug:
            return entry[1]
    raise NotImplementedError("The required form is not implemented or missing from the installed inputs")

视图在我的 django 应用程序的 views.py 模块中定义:

#views.py
from utils import get_input_form

@login_required
def add(request, slug):
    InputForm = get_input_form(slug)
    if request.method == "POST":
        form = InputForm(request.POST, request.FILES)
        if form.is_valid():
            object_id = form.save()
            messages.success(request, "Dataset created")
            return redirect(reverse("input:dataset", args=[str(object_id.inserted_id)]))
    else:
        form = InputForm()
    return render(request, "datasets/add-form.html", {"form":form})

但我收到此导入错误:

python manage.py runserver
Unhandled exception in thread started by <function wrapper at 0x7fe9c465c398>
Traceback (most recent call last):
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/home/jesus/workspace/tensorflow-board-django/venv/local/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/jesus/workspace/tensorflow-board-django/tensorflow_board_django/analysis/models.py", line 2, in <module>
    from ..input.forms import SOURCES
  File "/home/jesus/workspace/tensorflow-board-django/tensorflow_board_django/input/forms.py", line 2, in <module>
    from utils import save_dataset
  File "/home/jesus/workspace/tensorflow-board-django/tensorflow_board_django/input/utils.py", line 2, in <module>
    from installed_io import installed_inputs
  File "/home/jesus/workspace/tensorflow-board-django/tensorflow_board_django/input/installed_io.py", line 1, in <module>
    from forms import FileForm
ImportError: cannot import name FileForm

我尝试过的:

根据对原始 post 的评论,我对我的代码进行了以下更改:

我没有在 installed_io 模块上导入 classes,而是使用了字符串:

#installed_io.py
forms = [("json","JsonForm"),("csv","CsvForm"),....]

然后我将 utils.py 更改为从字符串导入 class:

from installed_io import installed_inputs    

def get_input_form(slug):
    for entry in installed_inputs:
        if entry[0] == slug:
            module = importlib.import_module("tensorflow_board_django.io.forms")
            class_name = entry[1]
            return getattr(module, class_name)
    raise NotImplementedError("The required form is not implemented or missing from the installed inputs")