【问题标题】:Why is the SnippetChooserPanel not opening in Wagtail?为什么 SnippetChooserPanel 没有在 Wagtail 中打开?
【发布时间】:2018-07-19 23:59:04
【问题描述】:

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

所以在下面的例子中,我删除了@register_sn-p 的行。有什么问题? 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 的 sn-p 示例: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'),
        # ...
    ]

【问题讨论】:

    标签: wagtail wagtail-snippet


    【解决方案1】:

    如果您通过 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']
    

    【讨论】:

      【解决方案2】:

      解决方案总是使用 @register_sn-p 装饰器,否则 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 2021-12-20
        • 2012-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多