繁体   English   中英

Python意外的导入行为

[英]Python unexpected import behaviour

我正在尝试构建一个视图,在该视图中,将基于表单块动态加载表单,在这样的元组列表中定义可用的表单,这旨在以“类似于框架”的方式加速新表单的开发:

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

通常在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定义了用于动态选择Form类的函数:

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

我尝试过的

  • 使用绝对路径更改导入语句
  • 删除pyc文件
  • 使用点表示法导入模块
  • 尝试在init .py上保存installed_input列表
  • 仅将所有代码移到views.py文件中有效 ,但是我发现此解决方案非常单一且非Python。

基于对原始帖子的评论,我对代码进行了以下更改:

而不是在installed_io模块上导入类,而是使用字符串:

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

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

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM