我在弄清楚如何实现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并将其添加到我已安装的应用程序中。
我的代码
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)))
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发挥作用所需要的。
对于其他尝试使此工作正常进行的人,可能会遇到麻烦。
步骤1.在views.py中设置选择器视图,
步骤2.在wagtail_hooks.py中注册视图集,
第3步。创建AdminChooser类,该类按名称引用注册的视图集,并在return函数中提供了它。
步骤4.导入所需的FieldPanel并将其用作小部件。