django 无法将`CheckboxSelectMultiple`用于wagtails `FieldPanel`中的选项:表单字段验证引发错误

lawou6xi  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(128)

在wagtail设置模型中,我有一个基于CharField的选择字段,并希望它在Wagtails FieldPanel中表现为多选。选项被正确呈现为多个复选框,但在提交时表单验证将引发错误:
选择有效选项。['OPT1']不是可用选项之一。
那么,我如何在Wagtails FieldPanel中使用基于文本的选择作为多选呢?
我必须以某种方式将表单字段类型覆盖为forms.fields.MultipleChoiceField吗?
widget属性设置为Select(而不是CheckboxSelectMultiple),正确呈现和填充的选择下拉窗口小部件将按预期工作。
我目前的实现看起来(大致)如下:

# models.py

@register_setting(icon='cog')
class MySettings(BaseGenericSetting):

    class MyChoices(models.TextChoices):
        OPT_1 = "OPT1"
        OPT_2 = "OPT2"

    choicefield = models.CharField(
        max_length=4,
        blank=True,
        choices=MyChoices.choices,
    )

    panels = [
        FieldPanel(
            'choicefield',
            widget=forms.CheckboxSelectMultiple,
        ),
    ]

我没有在定制生成的表单文档中找到任何提示。

rwqw0loc

rwqw0loc1#

这是因为CheckboxSelectMultiple返回的是一个所选项目的数组,而验证器期望的是在MyChoices中找到的单个值。
我想,这就是你需要的:

class MyChoices(models.Model):
    item = models.CharField(max_length=255)

@register_setting(icon='cog')
class MySettings(BaseGenericSetting):
    choicefield = models.ManyToManyField(MyChoices)
    panels = [
        FieldPanel(
            'choicefield',
            widget=forms.CheckboxSelectMultiple,
        ),
    ]

您需要从py命令行或在dbadmin中填充MyChoices,或者将其注册为代码片段,然后在Wagtail admin界面中添加您的值。
另外,请查看https://docs.wagtail.org/en/stable/getting_started/tutorial.html#tutorial-categories,它使用ParentalManyToManyField为博客类别创建了一个多-多选择字段。这就是我在Wagtail中处理这种情况的方法。
在后台,它设置了一个中间表,其中包含来自每个模型的ID对,以创建链接。

相关问题