Python 使用wagtail通用选择器的循环导入错误

Python 使用wagtail通用选择器的循环导入错误,python,django,python-3.x,importerror,wagtail,Python,Django,Python 3.x,Importerror,Wagtail,我正在使用wagtails wagtail generic chooser为我的数据模型创建CustomChooser,每当我引用其他modelAdmin模型时,它都非常有效 然而,我遇到了一种情况,我有一个Lexis模型,其中一个字段本身有一个FK链接。这个想法是有一个词汇术语,然后可以有相关的词汇术语连接到它。它可以与普通的FieldPanel配合使用,但当有数百个lexis术语时,这并不是一个很好的UI体验。因此,我想为这个字段创建一个自定义LexisChooser。然而,我遇到的问题是,

我正在使用wagtails wagtail generic chooser为我的数据模型创建CustomChooser,每当我引用其他modelAdmin模型时,它都非常有效

然而,我遇到了一种情况,我有一个Lexis模型,其中一个字段本身有一个FK链接。这个想法是有一个词汇术语,然后可以有相关的词汇术语连接到它。它可以与普通的FieldPanel配合使用,但当有数百个lexis术语时,这并不是一个很好的UI体验。因此,我想为这个字段创建一个自定义LexisChooser。然而,我遇到的问题是,根据文档,为了创建一个功能性小部件,我需要创建一个视图和adminChooser,该视图和adminChooser引用ChooserPanel连接到的模型

这是有道理的,但是,当我尝试将我的LexisChooser导入到我的Lexis模型中以将LexisChooser用作小部件时,我得到了下面的错误

ImportError:无法从“Lexis.models”导入名称“Lexis”

我意识到这是由于一个循环导入错误问题,因为我有一些子类正在导入Lexis类,以便构建LexisChooser小部件,然后我尝试将该小部件导入Lexis类

我知道这不是Wagtail的bug,也不是Wagtail泛型选择器的问题,但是,有人知道我如何重构代码来生成这个函数,以便我可以在Lexis模型的字段上使用LexisChooser吗

下面是我的代码

views.py创建视图 wagtail_.py寄存器视图 py创建一个小部件 lexis/models.py使用小部件 不幸的是,这会导致循环导入错误: ImportError:无法从“Lexis.models”导入名称“Lexis”

在研究这个错误时,我发现人们建议根据需要在类中导入Lexis,而不是在每个文件的顶部,但这似乎不适用于上面概述的子类,因为我遇到了相同的错误

如果您对如何重构代码以使其正常工作而不产生循环导入错误有任何想法,我们将不胜感激

我在跑步 Django 3, python 3.7, 摇尾2.8


谢谢

将模型文件拆分为两个单独的文件,分别包含
Lexis
LexisLink


然后
LexisLink
可以引用
LexisChooser
,而它干净地引用了
Lexis
模型

将模型文件拆分为两个单独的文件,分别包含
Lexis
LexisLink


然后
LexisLink
可以引用
LexisChooser
,而它干净地引用了
Lexis
模型

真是太棒了!谢谢@OregonTrail!我试图对你的答案投赞成票,但因为我是新来的,所以在我得到15票或更多票之前,他们不会计算。关于您的解决方案,我的一个问题是,由于修复了名称空间问题,这是否有效?通过使用init.py,它是否保持了名称空间的干净,因此没有冲突?嗯,不是真的。它工作的原因很简单,就是没有循环引用,因此没有依赖于执行顺序的行为<代码>\uuuu init\uuuuu.py始终存在,并针对作为目录的每个python模块执行。你可以通过点击复选标记来接受我的答案:)太棒了!谢谢@OregonTrail!我试图对你的答案投赞成票,但因为我是新来的,所以在我得到15票或更多票之前,他们不会计算。关于您的解决方案,我的一个问题是,由于修复了名称空间问题,这是否有效?通过使用init.py,它是否保持了名称空间的干净,因此没有冲突?嗯,不是真的。它工作的原因很简单,就是没有循环引用,因此没有依赖于执行顺序的行为<代码>\uuuu init\uuuuu.py始终存在,并针对作为目录的每个python模块执行。您可以通过单击复选标记接受我的答案:)
from django.utils.translation import ugettext_lazy as _
from generic_chooser.views import ModelChooserViewSet
from lexis.models import Lexis

class LexisChooserViewSet(ModelChooserViewSet):

    icon = 'user'
    model = Lexis
    page_title = _("Choose A Lexis Term")
    per_page = 20
    order_by = 'term'
    fields = ['term']
from wagtail.core import hooks
from .views import LexisChooserViewSet

@hooks.register('register_admin_viewset')
def register_lexis_chooser_viewset():
    return LexisChooserViewSet('lexis_chooser', url_prefix='lexis-chooser')
from django.utils.translation import ugettext_lazy as _
from generic_chooser.widgets import AdminChooser
from lexis.models import Lexis

class LexisChooser(AdminChooser):

     choose_one_text = _('Choose a Lexis')
     choose_another_text = _('Choose another Lexis')
     link_to_chosen_text = _('Edit this Lexis')
     model = Lexis
     choose_modal_url_name = 'lexis_chooser:choose'
from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.admin.edit_handlers import FieldPanel, InlinePanel
from wagtail.core.models import Orderable
from modelcluster.models import ClusterableModel
from chooser_panels.widgets import LexisChooser


# Orderable link to multiple other linked lexis terms
class LexisLink(Orderable):

    page = ParentalKey("lexis.Lexis", related_name="lexis_link")

    term_link = models.ForeignKey(
        'lexis.Lexis', 
        on_delete=models.SET_NULL, 
        related_name='term_linked', 
        null=True
    )

    panels = [
        FieldPanel("term_link", widget=LexisChooser)
    ]


class Lexis(ClusterableModel):

    template = "lexis/lexis_page.html"
    term = models.CharField(max_length=100, blank=True, null=True)
    panels = [
        FieldPanel("term"),
        InlinePanel('lexis_link', label='Linked Lexis Terms'), 
    ]

    def __str__(self):
        return self.term

    class Meta:
        verbose_name = "Lexis"
        verbose_name_plural = "Lexis"