为什么 SnippetChooserPanel 没有在 Wagtail 中打开?

Why is the SnippetChooserPanel not opening in Wagtail?

前段时间我停止使用@register_snippet 来装饰片段。这会将片段从管理员的片段部分中取出。 相反,为了方便用户,我使用 wagtail_hooks.py 直接在左侧管理面板中显示代码段。见下文。这很好用,因为用户可以直接转到代码段,您还可以更改显示的字段和字段的顺序 - 很好。

因此在下面的示例中,我删除了@register_snippet 行。有什么收获? SnippetChooserPanel 不起作用!后来我构建了一个复杂的模型,但 SnippetChooserPanel 不起作用。我浪费了很多时间认为问题出在我的模型的复杂性上。我想节省别人的时间!

wagtail_hooks.py:

from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from wagtail.wagtailsnippets.models import register_snippet
from demo.models import Advert

class AdvertAdmin(ModelAdmin):
    model = Advert

modeladmin_register(AdvertAdmin)

这是来自 Wagtail 的代码片段示例:snippets

@register_snippet #<------- Source of issue (I removed this line!)

@python_2_unicode_compatible  # provide equivalent __unicode__ and __str__ methods on Python 2
class Advert(models.Model):
    url = models.URLField(null=True, blank=True)
    text = models.CharField(max_length=255)

    panels = [
        FieldPanel('url'),
        FieldPanel('text'),
    ]

    def __str__(self):
        return self.text

class BookPage(Page):
    advert = models.ForeignKey(
        'demo.Advert',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+'
    )

    content_panels = Page.content_panels + [
        SnippetChooserPanel('advert'),
        # ...
    ]

解决方案是始终使用@register_snippet 装饰器,否则 SnippetChooserPanel 不起作用!

@register_snippet
@python_2_unicode_compatible 
class Advert(models.Model):
    url = models.URLField(null=True, blank=True)
    text = models.CharField(max_length=255)

    panels = [
        FieldPanel('url'),
        FieldPanel('text'),
    ]

    def __str__(self):
        return self.text

如果您通过 modelAdmin 使您的代码段可编辑,您仍然需要应用装饰器 @register_snippet。否则选择器面板 route/view 将不可用。此视图由在 SnippetChooser 模式打开时触发的 ajax 请求请求。缺少 @register snippet 将抛出 404。

您可以通过 construct_main_menu 挂钩注册菜单项。您可以使用相同的挂钩来删除现有的菜单项。如果您不想要 'Snippets' 菜单项,请将其删除。在 wagtail_hooks.py:

@hooks.register('construct_main_menu')
def hide_snippet(request, menu_items):
    menu_items[:] = [item for item in menu_items if item.name != 'snippets']