在 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 字段类型的文档不足。