Как получить выпадающий список для поля 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
        ]

Ссылки на документы

Вернуться на верх