0

前段时间我停止使用@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 的代码片段示例

@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'),
        # ...
    ]
4

2 回答 2

1

如果您通过 modelAdmin 使您的 Snippets 可编辑,您仍然需要应用 decorator @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']
于 2018-07-20T21:12:49.877 回答
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
于 2018-07-19T23:59:04.957 回答