【问题标题】:Form Widget for CommaSeparatedIntegerFieldCommaSeparatedIntegerField 的表单小部件
【发布时间】:2015-05-03 15:35:33
【问题描述】:

我有一个问题,有人可以从给定的集合中选择多个选项。像这样:

什么是A?

  1. B
  2. C
  3. D

在这里,填写表格的人可以选择 3 个选项的任意组合。例如,B、C、BC、BCD

我正在尝试将此信息存储在数据库中。

我的模型中的一个字段是 CommaSeparatedIntegerField,如下所示:

class Tutor(models.Model):
    want_list = models.CommaSeparatedIntegerField(max_length=50, null=True,)

我创建了一个使用此模型的表单,如下所示:

class MyForm(forms.ModelForm):      
    class Meta:
        model = Tutor
        fields = ['want_list']
        widgets = {'want_list': forms.CheckboxSelectMultiple(choices=P3_CHOICES),}

由于我得到的默认小部件是 TextInput,因此我将小部件更改为 CheckboxSelectMultiple。我正在使用软盘形式。

但是,这样数据似乎无法验证。这是我得到的错误:

“只输入用逗号分隔的数字。”

...每当我选择任何选项并尝试提交表单时。

如何解决此错误?我在模型中使用了错误的字段吗?还是表单中的错误小部件?实现这样的事情的一般方法是什么?我想这是许多网站上常见的事情,并且必须有一些我不知道的标准方法来解决这个问题。

提前致谢。

编辑:

P3_CHOICES = (
    (1, 'B'),
    (2, 'C'),
    (3, 'D'),        
)

【问题讨论】:

  • P3_CHOICES的值是多少?
  • 对不起。将其添加到问题中,因为这是相关信息。

标签: django django-models django-forms


【解决方案1】:

这是因为 CheckboxSelectMultiple 的值将被 Django 反序列化以列出一个值(例如:['1', '2']),而不是CommaSeparatedIntegerField 期望的以逗号分隔的整数列表(例如:'1,2')。

一种解决方案是创建 CheckboxSelectMultiple 的子类来满足您的需求:

class CommaSeparatedCheckboxSelectMultiple(CheckboxSelectMultiple):
    def value_from_datadict(self, *args, **kwargs):
        data_list = super(CommaSeparatedCheckboxSelectMultiple, self).value_from_datadict(*args, **kwargs)
        return ','.join(data_list)

【讨论】:

  • 我尝试了这段代码,但是得到了一个“name 'self' is not defined”的错误。
  • @AshishAcharya 我编辑了我的答案,它现在可以工作了(value_from_datadict 的第一个参数必须是self
  • 像魅力一样工作。谢谢!
【解决方案2】:

虽然 aumo 的出色回答完美地解决了我的问题,但我意识到我正在尝试重新发明轮子。所以,我去搜索并找到了一个很棒的 Python 包,它完全可以完成我想要完成的工作。

https://pypi.python.org/pypi/django-multiselectfield/

这是我的实现:

models.py

​​>
from multiselectfield import MultiSelectField

P3_CHOICES = (
    (1, 'B'),
    (2, 'C'),
    (3, 'D'),        
)

class Tutor(models.Model):
    want_list = MultiSelectField(choices=P3_CHOICES, null=True)

forms.py

​​>
class MyForm(forms.ModelForm):      
    class Meta:
        model = Tutor
        fields = ['want_list']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多