前一段时间,我停止使用@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'),
# ...
]
答案 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']