在 Django 中使用 CommaSeparatedIntegerField 的表单不能处理超过 10 个选项
Form not working with more than 10 choices using CommaSeparatedIntegerField in Django
在关注了相当有用的博客 post 之后,我遇到了小部件(forms.SelectMultiple 或 forms.CheckboxSelectMultiple)的问题,无法正确显示之前 select 的选项ed,如果选择的数量 > 9.
型号:
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(",")
如果您 select 列表中的任何选项,它确实正确地保存到数据库中(通过清理功能),但是当您返回到上面 9 的表格选项时,不再 select编辑。其他选项被标记为 selected - 选择 1 和值 10;例如如果您选择选项 13,选项 1 和 3 将在返回表单时 selected
请帮忙!?!
编辑:仅供参考,我将 Django 1.8.3 与 Python 3.4.0 一起使用。
我认为问题是当您在 clean 方法中将列表转换为逗号分隔的字符串时...看起来 Django 在显示表单时会使用此值。
似乎 Django 需要一个列表并迭代字段值,所以当你传递它时说 '13'
Django 将 select '1'
和 '3'
(因为字符串可以作为字符列表迭代)
所以在将表单预期的内容(值列表)与数据库字段预期的内容(逗号分隔的字符串)相匹配时出现问题
我认为没有直接的解决方案。
也许尝试使用自定义数据库字段作为起点的类似此片段的内容:
https://djangosnippets.org/snippets/2753/
感谢来自 Anentropic 的 link,linked 页面上的评论之一是针对将该代码段扩展到 django-multiselectfield 的人:https://pypi.python.org/pypi/django-multiselectfield/0.1.3
我已经安装了它,更改了我的模型以使用新的 MultiSelectField 字段类型,一切正常。非常感谢 Anentropic 让我到达那里。
遗憾的是 CommaSeparatedIntegerField 字段类型的文档不足。
在关注了相当有用的博客 post 之后,我遇到了小部件(forms.SelectMultiple 或 forms.CheckboxSelectMultiple)的问题,无法正确显示之前 select 的选项ed,如果选择的数量 > 9.
型号:
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(",")
如果您 select 列表中的任何选项,它确实正确地保存到数据库中(通过清理功能),但是当您返回到上面 9 的表格选项时,不再 select编辑。其他选项被标记为 selected - 选择 1 和值 10;例如如果您选择选项 13,选项 1 和 3 将在返回表单时 selected
请帮忙!?!
编辑:仅供参考,我将 Django 1.8.3 与 Python 3.4.0 一起使用。
我认为问题是当您在 clean 方法中将列表转换为逗号分隔的字符串时...看起来 Django 在显示表单时会使用此值。
似乎 Django 需要一个列表并迭代字段值,所以当你传递它时说 '13'
Django 将 select '1'
和 '3'
(因为字符串可以作为字符列表迭代)
所以在将表单预期的内容(值列表)与数据库字段预期的内容(逗号分隔的字符串)相匹配时出现问题
我认为没有直接的解决方案。
也许尝试使用自定义数据库字段作为起点的类似此片段的内容:
https://djangosnippets.org/snippets/2753/
感谢来自 Anentropic 的 link,linked 页面上的评论之一是针对将该代码段扩展到 django-multiselectfield 的人:https://pypi.python.org/pypi/django-multiselectfield/0.1.3
我已经安装了它,更改了我的模型以使用新的 MultiSelectField 字段类型,一切正常。非常感谢 Anentropic 让我到达那里。
遗憾的是 CommaSeparatedIntegerField 字段类型的文档不足。