Почему 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