在Django中使用CommaSeparatedIntegerField表示不能使用10个以上的选项

时间:2015-08-04 11:23:37

标签: django django-forms

在关注相当有用的博客post之后,我遇到小部件的问题(forms.SelectMultiple或forms.CheckboxSelectMultiple)没有正确显示先前选择了哪些选项,如果选项的数量是> 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(",")

如果您在列表中选择任何选项,它会正确保存到数据库(通过清理功能),但当您返回到表单选项时,不再选择上面的9。其他选项被标记为选择 - 选择1和值-10;例如如果你选择选择13,选择1&返回表格

时将选择3

请帮忙!?!

编辑:仅供参考,我使用Django 1.8.3和Python 3.4.0。

2 个答案:

答案 0 :(得分:0)

我认为问题是当您在清洁方法中将列表转换为逗号分隔的字符串时......看起来Django在显示表单时会使用此值。

似乎Django期待一个列表并迭代字段值,所以当你传递它时说'13' Django将选择'1''3'(因为字符串可以作为列表迭代字符)

所以有一个问题是匹配表单所期望的(值列表)与db字段期望的内容(逗号分隔的字符串)

我认为没有直接的解决方案。

也许尝试使用自定义数据库字段作为起点的此片段:
https://djangosnippets.org/snippets/2753/

答案 1 :(得分:0)

感谢Anentropic的链接,链接页面上的一条评论是针对那些将该片段扩展为django-multiselectfield的人:https://pypi.python.org/pypi/django-multiselectfield/0.1.3

我已经安装了,改变了我的模型以使用新的MultiSelectField字段类型,一切正常。非常感谢Anentropic让我到那儿。

对于记录不佳的CommaSeparatedIntegerField字段类型感到遗憾。