ParentalKey не отображается в StructBlock

Я пытаюсь создать собственный StructBlock, который я хочу использовать внутри StreamField. Вот в StructBlock у меня 4 поля, а именно:

  • background_style
  • заглавие
  • изображение
  • категория

Это мой код:

from django.db import models

from wagtail.wagtailcore.models import Page
from wagtail.wagtailcore.fields import StreamField

from wagtail.wagtailcore import blocks
from wagtail.wagtailimages.blocks import ImageChooserBlock
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
from wagtail.wagtailsnippets.models import register_snippet

from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
from modelcluster.fields import ParentalKey

from .vars import BackgroundChoices


class BaseBlock(blocks.StructBlock):
    background_style = blocks.ChoiceBlock(choices=BackgroundChoices, icon='color', required=False)


@register_snippet
class LeadCaptureCategory(models.Model):
    name = models.CharField(max_length=255)
    about = models.CharField(max_length=255, blank=True)
    icon = models.ForeignKey(
        'wagtailimages.Image', null=True, blank=True,
        on_delete=models.SET_NULL, related_name='+'
    )

    panels = [
        FieldPanel('name'),
        FieldPanel('about'),
        ImageChooserPanel('icon'),
    ]

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'Lead Capture Categories'


class LeadCaptureForm(BaseBlock):
    title = blocks.CharBlock(required=False)
    image = ImageChooserBlock(required=False)
    category = blocks.BlockField(ParentalKey('LeadCaptureCategory'))

    class Meta:
        icon = 'plus-inverse'
        label = 'lead capture form'.title()
        admin_text = label
        template = 'home/blocks/lead_capture_form.html'


class HomePage(Page):
    template = 'home/home_page.html'
    menu = models.CharField(max_length=128, blank=True)
    body = StreamField([
        ('lead_capture_form', LeadCaptureForm()),
    ], blank=True)

    content_panels = Page.content_panels + [
        StreamFieldPanel('body'),
    ]

3 из этих полей в admin отображаются правильно, кроме category (которое вообще не отображается). Вы можете видеть, что category основано на modelcluster.fields.ParentalKey. Может ли это быть проблема?

введите здесь описание изображения

Есть идеи, как это решить?

In [27]: wagtail.__version__
Out[27]: '1.13.1'

person NarūnasK    schedule 02.03.2018    source источник


Ответы (1)


Вы правы, вы не можете построить блок из ParentalKey вот так. Похоже, что вы действительно хотите, это SnippetChooserBlock:

from wagtail.wagtailsnippets.blocks import SnippetChooserBlock

class LeadCaptureForm(BaseBlock):
    title = blocks.CharBlock(required=False)
    image = ImageChooserBlock(required=False)
    category = SnippetChooserBlock(LeadCaptureCategory)
person gasman    schedule 02.03.2018
comment
Я знал, что это будет легко, как ветер. Это где-то задокументировано? - person NarūnasK; 03.03.2018
comment
Да — docs.wagtail.io/en/v1.13.1/ темы/ - person gasman; 03.03.2018