【问题标题】:Form not working with more than 10 choices using CommaSeparatedIntegerField in Django在 Django 中使用 CommaSeparatedIntegerField 的表单不能处理超过 10 个选项
【发布时间】: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_data dict docs.djangoproject.com/en/1.8/ref/forms/validation/…
  • 对此不确定-即使您链接到的 1.8 文档中的示例也只返回字段数据,而不是字典?如果您正在清理整个表单数据,它应该在下面的部分中提到它应该返回 dict,但即使这在 Django>=1.7 中也是可选的。此外,它无论如何也不能解决问题。
  • 我的错误,对不起,你是对的,我上面的 secong 评论是错误的 :)

标签: django django-forms


【解决方案1】:

我认为问题在于当您在 clean 方法中将列表转换为逗号分隔的字符串时......看起来这个值随后被 Django 在显示表单时使用。

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

因此,将表单期望的内容(值列表)与 db 字段期望的内容(逗号分隔的字符串)匹配存在问题

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

也许以自定义 db 字段为起点尝试类似 sn-p 的操作:
https://djangosnippets.org/snippets/2753/

【讨论】:

  • 太好了,谢谢。我试图投票,但我在这里没有任何声誉:(
【解决方案2】:

感谢 Anentropic 的链接,链接页面上的其中一个 cmets 是针对将 sn-p 扩展到 django-multiselectfield 的人:https://pypi.python.org/pypi/django-multiselectfield/0.1.3

我已经安装了它,更改了我的模型以使用新的 MultiSelectField 字段类型,并且一切正常。非常感谢 Anentropic 让我到达那里。

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

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多