Как использовать InlinePanel в ModelAdmin?

Я устанавливаю модель, которая должна быть создана с несколькими экземплярами подмодели. Я хочу иметь возможность редактировать и создавать эту модель в интерфейсе администратора, поэтому я добавляю ее с помощью ModelAdmin, Согласно документации, я должен иметь возможность указать поля / панели в соответствии с нормой Page типы; однако, когда я добавляю InlinePanel Я получаю KeyError на имя связанного поля.

models.py

class Application(models.Model):
    # other fields....

    panels = [MultiFieldPanel([
        FieldPanel('applicant'),
        FieldPanel('position'),
        FieldPanel('cover_letter'),
        FieldPanel('qualifications'),
        InlinePanel('references'),
        FieldPanel('draft'),
    ])]


class Reference(models.Model):

    application = models.ForeignKey(
        Application,
        related_name='references',
        on_delete=models.CASCADE,
        blank=False,
    )

    # other fields....

wagtails_hooks.py

class ApplicationAdmin(ModelAdmin):
    model = Application
    menu_icon = 'mail'
    menu_order = 400
    list_display = # other fields....

modeladmin_register(ApplicationAdmin)

ошибка

URL запроса: http://127.0.0.1:8000/admin/involvement/application/create/

Джанго версия: 1.10.5

Тип исключения: KeyError

Значение исключения: "ссылки"

Расположение исключения: /[APPFOLDER]/venv/lib/python3.6/site-packages/wagtail/wagtailadmin/edit_handlers.py в init, строка 627

У меня проблемы с определением того, что я сделал неправильно. Кто-нибудь может указать мне правильное направление?

1 ответ

Решение

Wagtail использует библиотеку django-modelcluster, которая позволяет обрабатывать родительские и дочерние модели в формах как единое целое. Чтобы это работало, базовая модель приложения должна наследоваться от modelcluster.models.ClusterableModel (трясогузка Page модель делает это как стандарт), а дочерняя модель должна быть связана ParentalKey а не ForeignKey,

Детские модели в InlinePanel также, как правило, подклассы Orderableчтобы их можно было отсортировать; не могу вспомнить, является ли это абсолютным требованием или просто рекомендацией.

from modelcluster.models import ClusterableModel

class Application(ClusterableModel):
    # ...

class Reference(Orderable):
    application = models.ParentalKey(
        Application,
        related_name='references',
        on_delete=models.CASCADE,
        blank=False,
    )
Другие вопросы по тегам