【发布时间】:2015-08-04 11:23:37
【问题描述】:
在关注了相当有用的博客post 之后,如果选项数量大于 9,我遇到了小部件(forms.SelectMultiple 或 forms.CheckboxSelectMultiple)无法正确显示先前已选择的选项的问题。
型号:
from django.db import models
class Flower(models.Model):
'''Flowers'''
flowers = models.CommaSeparatedIntegerField(max_length=100, default="1,2", blank=True)
表格:
from django import forms
class FlowerForm(forms.ModelForm):
FLOWERS = (
('0', 'Daisies'),
('1', 'Petunias'),
('2', 'Roses'),
('3', 'Forget-me-nots'),
('4', 'Choice 4'),
('5', 'Choice 5'),
('6', 'Choice 6'),
('7', 'Choice 7'),
('8', 'Choice 8'),
('9', 'Choice 9'),
('10', 'Choice 10'),
('11', 'Choice 11'),
('12', 'Choice 12'),
('13', 'Choice 13'),
)
flowers = forms.MultipleChoiceField(
widget=forms.CheckboxSelectMultiple, choices=FLOWERS, initial="1")
def clean_flowers(self):
field = ""
for data in self.cleaned_data['flowers']:
field += str(data)+","
return field.lstrip(",")
如果您选择列表中的任何选项,它确实会正确保存到数据库(通过清理功能),但是当您返回表单时,不再选择 9 以上的选项。其他选项被标记为选中 - 选项 1 和值 10;例如如果您选择选项 13,则返回表单时将选择选项 1 和 3
请帮忙!?!
编辑:仅供参考,我将 Django 1.8.3 与 Python 3.4.0 一起使用。
【问题讨论】:
-
不能解决您的问题,但您可以通过
return ",".join(self.cleaned_data['flowers'])... 学习方便的 Python 模式来简化clean_flowers方法:) -
另一个问题是你违反了 Django
clean_<field>方法的合同,它应该返回(修改后的)cleaned_datadict docs.djangoproject.com/en/1.8/ref/forms/validation/… -
对此不确定-即使您链接到的 1.8 文档中的示例也只返回字段数据,而不是字典?如果您正在清理整个表单数据,它应该在下面的部分中提到它应该返回 dict,但即使这在 Django>=1.7 中也是可选的。此外,它无论如何也不能解决问题。
-
我的错误,对不起,你是对的,我上面的 secong 评论是错误的 :)
标签: django django-forms