Как использовать 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,
)