Django,创建多选复选框输入

时间:2013-10-28 21:16:59

标签: django django-models django-views

我有一个带整数字段的模型,并希望有一个替代的表单输入呈现而不是默认的文本框,所以我有以下内容:

models.py: myfield = models.IntegerField(default=7, blank=True)

想拥有以下内容:

  

[x] Choice A (value 0)

     

[ ] Choice B (value 1)

     

[x] Choice C (value 2)

因此,在save之后,将按以下方式计算选项:(因为选择了选项A和C而未选择2)。

myfield = sum(选择的选项乘以2到所选选项的值)

这样:

  

my field = (1 * 2^0) + (0 * 2^1) + (1 * 2^2)

     

my field = 1 + 0 + 4

     

my field = 5 #final value

如果这是Django以外的任何东西,那么通过标准的Checkbox分组会直接映射到模型中的数据库字段会更直接,但是对于Django,我目前处于亏损状态。

我引用了以下材料,但仍无法弄清楚该怎么做:

  

widgets

     

modelforms

感谢您的帮助和意见。

2 个答案:

答案 0 :(得分:3)

您可以使用以下自定义小部件:

from django import forms

class BinaryWidget(forms.CheckboxSelectMultiple):
    def value_from_datadict(self, data, files, name):
        value = super(BinaryWidget, self).value_from_datadict(data, files, name)
        if name == 'myfield':
            value = sum([2**(int(x)-1) for x in value])
        return value

并覆盖模型中的myfield,如下所示:

class MyModelForm(forms.ModelForm):
    ...
    myfield = forms.IntegerField(widget=BinaryWidget(choices=(
        ('1', '2^0',), ('2', '2^1',), ('3', '2^2',)
        )))

这会给你预期的结果,虽然你可能需要一个反向功能 - 例如在编辑时设置初始值,如果有,请告诉我,所以我们也可以进行编辑。

答案 1 :(得分:-1)

试试Select2。这是一个更好的选择。