我怎样才能在 Wagtail Admin 中获得 CharField 的下拉列表?

How can i get a dropdown for a CharField in 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,
)

在 wagtail 中,这不起作用:

panels = [
   FieldPanel('status'),
]

如果该字段是 CharField,但它确实适用于 TextField。我如何为 CharField 修复或实施此问题?

上面的代码在使用 CharField 时工作正常,所以我假设您想使用 TextField 来代替它。

在定义 Django 模型的字段时,每个字段都带有一个默认小部件,CharField 在向字段提供 choices 并使用 Select 小部件时有一些更智能的处理.

但是,TextField's default widgetTextArea,因此您需要向 Wagtail 提供您要使用的小部件。

Widgets 是一个 Django 术语,表示如何将字段显示为 HTML 字段,Select widget 是您想要用于下拉列表的内容,但还有许多其他内置小部件.

最后,告诉 Wagtail 要为 FieldPanel you need to pass in a widget kwarg 使用什么小部件。

在此之后,您应该会看到 UI 将显示 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
        ]

文档链接