首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SelectMultiple渲染的Django ArrayField没有将选定的选项显示为' selected‘

使用SelectMultiple渲染的Django ArrayField没有将选定的选项显示为' selected‘
EN

Stack Overflow用户
提问于 2018-10-16 15:35:12
回答 1查看 1.7K关注 0票数 0

我正在尝试使用SelectMultiple小部件呈现postgres Arrayfield值,如下所示

在models.py中:

代码语言:javascript
运行
复制
SLOT_CHOICES = (('A','Slot A'),('B','Slot B'),('C','Slot C'),('D','Slot D'),('E','Slot E'),('F','Slot F'),('G','Slot G'),('H','Slot H'),('P','Slot P'),('Q','Slot Q'),('R','Slot R'),('S','Slot S'),('T','Slot T'),)
core_slots = ArrayField(models.CharField(max_length=1,choices=SLOT_CHOICES),blank=True,null=True)

在forms.py中:

代码语言:javascript
运行
复制
    self.fields['core_slots'].widget = forms.SelectMultiple(attrs={
            'placeholder': 'Choose slots',
            'class': 'multi-select-input',
        },choices=self.Meta.model.SLOT_CHOICES)

如果我选择一个选项并提交,然后尝试使用'instance‘获取已填写的表单,那么它可以正常工作,并将之前选择的选项显示为' selected’。但如果我选择了多个选项,那么在提交时,所有选定的值都会正确地插入到数据库中,但如果我尝试使用'instance‘获取已填写的表单,那么它不会显示任何选项为选中。

这个问题不会发生在ManyToManyField上。

在models.py中:

代码语言:javascript
运行
复制
past_courses = models.ManyToManyField(Course,blank=True)

在forms.py中:

代码语言:javascript
运行
复制
    self.fields['past_courses'].queryset = Course.objects.filter(~Q(dept=self.instance.dept)).order_by('name')
    self.fields['past_courses'].widget.attrs.update({
            'placeholder': 'Choose past courses',
            'class': 'multi-select-input',
        })

这个运行得很好。只有使用SelectMultiple小部件呈现的ArrayField才有问题。我想在模板中显示提交的选项,有没有办法解决这个问题,或者有没有其他方法可以在模板中显示选定的选项。

EN

回答 1

Stack Overflow用户

发布于 2018-11-09 05:56:35

我发现这似乎是一个问题,因为SelectMultiple小部件使用了ChoiceWidget,它有一个错误地处理多个选择的format_value方法。至少在Django 1.11中是这样的。format_value执行以下操作:

代码语言:javascript
运行
复制
def format_value(self, value):
    """Return selected values as a list."""
    if value is None and self.allow_multiple_selected:
        return []
    if not isinstance(value, (tuple, list)):
        value = [value]
    return [force_text(v) if v is not None else '' for v in value]

正如您所看到的,它应该以列表的形式返回所选值。但是,如果它不是元组或列表,则运行的代码是错误的。它本质上只是使值中的项成为列表中的单个条目。所以当你选择了像'A','B‘和'C’这样的多个项目时,它们就变成了'A,B,C‘这样的format_value函数--这是错误的。它需要是'A','B','C‘。所以我只是放入代码,用下面的代码覆盖这个函数:

代码语言:javascript
运行
复制
def format_value(self, value):
    """Return selected values as a list."""
    if value is None and self.allow_multiple_selected:
        return []
    if not isinstance(value, (tuple, list)):
        # This means it should be a comma delimited list of items so parse it
        value = value.split(',')

    return [force_text(v) if v is not None else '' for v in value]

现在这对我来说似乎很好用。我在Django 1.11上测试了选择单个项目,多个项目,没有项目和所有内容都正确地保存到数据库中,并在Django Admin fine上显示出来。希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档