为什么SnippetChooserPanel无法在Wagtail中打开?

时间:2018-07-19 23:59:05

标签: wagtail wagtail-snippet

前一段时间,我停止使用@register_snippet装饰片段。这会将摘录从admin的摘录部分中删除。 相反,为了方便用户,我使用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)

以下是Wa的摘录示例: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'),
        # ...
    ]

2 个答案:

答案 0 :(得分:0)

解决方案始终使用@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

答案 1 :(得分:0)

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

您可以通过construct_main_menu钩子注册菜单项。您可以使用相同的钩子来删除现有的菜单项。如果您不希望“代码段”菜单项将其删除。在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']