Почему SnippetChooserPanel не открывается в Wagtail?

Некоторое время назад я перестал использовать @register_snippet для украшения фрагментов. Это убирает фрагмент из раздела администрирования. Вместо этого я использовал wagtail_hooks.py, чтобы показать фрагмент прямо в левой панели администратора для удобства пользователя. Увидеть ниже. Это работает хорошо, так как пользователь может перейти непосредственно к фрагменту, и вы также можете изменить отображаемые поля и порядок полей - хорошо.

Поэтому в приведенном ниже примере я удалил строку с надписью @register_snippet. В чем подвох? Панель SnippetChooser не работает! Позже я строил сложную модель, и 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'),
        # ...
    ]

2 ответа

Решение

Если вы делаете свои сниппеты редактируемыми через modelAdmin, вам все равно нужно применить декоратор @register_snippet, В противном случае панель выбора маршрута / вида будет недоступна. Это представление запрашивается запросом ajax, запущенным на модальном открытом SnippetChooser. Отсутствует @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']

Решение всегда заключается в использовании @register_snippet decorator, в противном случае 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
Другие вопросы по тегам