我正在尝试使用SelectMultiple小部件呈现postgres Arrayfield值,如下所示
在models.py中:
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中:
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中:
past_courses = models.ManyToManyField(Course,blank=True)在forms.py中:
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才有问题。我想在模板中显示提交的选项,有没有办法解决这个问题,或者有没有其他方法可以在模板中显示选定的选项。
发布于 2018-11-09 05:56:35
我发现这似乎是一个问题,因为SelectMultiple小部件使用了ChoiceWidget,它有一个错误地处理多个选择的format_value方法。至少在Django 1.11中是这样的。format_value执行以下操作:
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‘。所以我只是放入代码,用下面的代码覆盖这个函数:
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上显示出来。希望这能有所帮助。
https://stackoverflow.com/questions/52830191
复制相似问题