wagtail-generic-chooser小部件(NoReverseMatch)

问题描述 投票:0回答:1

我在弄清楚如何实现wagtail-generic-chooser时遇到了麻烦。我的目标很简单。我有很多数据不是分层的,因此将数据创建为Pages没有意义。 Wagtail Model Admin是完美的解决方案。但是,我需要能够在模型之间交叉引用数据,并且理想情况下,在选择数据时最好具有一个类似于PageChooserPanel或SnippetChooserPanel的Chooser Panel。但是,w没有内置Modelchooserpanel。我尝试了许多尝试实现此目的的第三方应用程序,但它们不适用于较新版本的wagtail或python 3。为我需要的模型连接创建一个snippetChooserPanel类型选择器。

不幸的是,我遇到了问题我已按照文档中概述的实施说明进行操作,但不清楚所有内容或应如何填写。

https://github.com/wagtail/wagtail-generic-chooser#chooser-widgets-model-based

我有一个引用事件类别模型的事件模型。事件类别模型和事件模型都被设置为modelAdmin元素。

我安装了wagtail-generic-chooser并将其添加到我已安装的应用程序中。

我的代码

categories.widget.py

from django.contrib.admin.utils import quote
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _

from generic_chooser.widgets import AdminChooser

from categories.models import CategoryEventCollection

class EventChooser(AdminChooser):
    choose_one_text = _('Choose a Event')
    choose_another_text = _('Choose another Event')
    link_to_chosen_text = _('Edit this Event')
    model = CategoryEventCollection

    #question???
    choose_modal_url_name = 'event_chooser:choose'

def get_edit_item_url(self, item):

    #question???
    return reverse('wagtailsnippets:edit', args=('categories', 'CategoryEventCollection', quote(item.pk)))

在事件模型events.models.py中的使用

from django.db import models
from wagtail.admin.edit_handlers import MultiFieldPanel, FieldPanel, PageChooserPanel
from wagtail.core.fields import RichTextField

from wagtail.images.edit_handlers import ImageChooserPanel
from modelcluster.models import ClusterableModel
from categories.widgets import EventChooser


class EventOverview(ClusterableModel):

    template = 'events/event_overview_page'

    collection = models.ForeignKey(
        "categories.CategoryEventCollection",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+"
    )
    event_title = models.CharField(max_length=120, blank=True, null=True)
    event_descriptor = models.TextField(blank=True, null=True)

    panels = [

        FieldPanel("collection", widget=EventChooser),
        FieldPanel("event_title"),
        FieldPanel("event_descriptor"),

    ]


    class Meta:
        verbose_name = "Event Overview"
        verbose_name_plural = "Event Overviews"

在widget.py文件中,“ choose_modal_url_name”值从何而来?我将它从上面的docs示例中的people_chooser重命名为与我的课程相关的名称,但它似乎导致了错误。我需要在某个地方注册该值吗?我需要注册小部件吗?还是这个值来自特定的地方。当前,它引发错误:

NoReverseMatch位于/ admin / events / eventoverview / edit / 1 /'event_chooser'不是注册的名称空间

对于此函数,我在哪里获取反向函数的值。我不是引用wagtailsnippet,而是引用wagtailmodel,所以如何引用呢?我在args元组中使用什么?

def get_edit_item_url(self, item):

    #question???
    return reverse('wagtailsnippets:edit', args=('categories', 'CategoryEventCollection', quote(item.pk)))

您可以提供的任何建议或指示,将不胜感激。或者,如果您可以让我知道使此型号chooserpanel发挥作用所需要的。

python widget wagtail modeladmin
1个回答
0
投票

对于其他尝试使此工作正常进行的人,可能会遇到麻烦。

步骤1.在views.py中设置选择器视图,

步骤2.在wagtail_hooks.py中注册视图集,

第3步。创建AdminChooser类,该类按名称引用注册的视图集,并在return函数中提供了它。

步骤4.导入所需的FieldPanel并将其用作小部件。

© www.soinside.com 2019 - 2024. All rights reserved.