Как получить выпадающий список для поля CharField в Wagtail Admin?
В Django Admin можно добавить выпадающий селектор со всеми возможными значениями перечислений, как в этом примере:
class ThesisStatus(models.TextChoices):
OPEN = 'O', _('Offen')
TAKEN = 'T', _('Vergeben')
WORK_IN_PROGRESS = 'W', _('In Arbeit')
COMPLETED = 'C', _('Komplett')
ABORTED = 'A', _('Abgebrochen')
status = models.CharField(
max_length=1,
choices=ThesisStatus.choices,
default=ThesisStatus.OPEN,
)
В трясогузке это не работает:
panels = [
FieldPanel('status'),
]
если поле является CharField
, но оно работает для TextField
. Как я могу исправить или реализовать это для CharField
?
Код выше работает нормально при использовании CharField
, поэтому я предположил, что вы хотите заставить его работать с TextField
вместо этого.
При определении поля модели Django каждое поле поставляется с виджетом по умолчанию, CharField
имеет несколько более умную обработку для случаев, когда choices
предоставляется полю и используется виджет Select
.
Однако, виджет TextField
по умолчанию является виджетом TextArea
, поэтому вам необходимо предоставить Wagtail виджет, который вы хотите использовать.
Виджеты - это термин Django для обозначения способа представления поля в виде HTML-поля, Select
виджет - это то, что вы хотите использовать для выпадающего списка, но есть много других встроенных виджетов.
Наконец, чтобы указать Wagtail, какой виджет использовать для FieldPanel
, нужно передать widget
kwarg.
После этого вы должны увидеть, что в пользовательском интерфейсе появится выпадающий список select, но в базе данных он будет храниться как TextField
.
Пример: models.py
from django import forms
from django.db import models
class MyPage(Page):
# ... other fields
class ThesisStatus(models.TextChoices):
OPEN = "O", "Offen"
TAKEN = "T", "Vergeben"
WORK_IN_PROGRESS = "W", "In Arbeit"
COMPLETED = "C", "Komplett"
ABORTED = "A", "Abgebrochen"
# note: using `models.TextField` here
status = models.TextField(
max_length=1,
choices=ThesisStatus.choices,
default=ThesisStatus.OPEN,
)
content_panels = Page.content_panels + [
FieldPanel("status", widget=forms.Select), # note: using widget here
# ... other panels
]