为什么 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']
前段时间我停止使用@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']