1

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

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#最终值

如果这是 Django 之外的任何东西,那么通过不直接映射到模型中的数据库字段的标准复选框分组会更直接,但是对于 Django,我目前不知所措。

我参考了以下材料,但仍然无法弄清楚该怎么做:

小部件

模型形式

感谢您的帮助和意见。

4

2 回答 2

4

您可以像这样使用自定义小部件:

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',)
        )))

这将为您提供预期的结果,尽管您可能需要反向功能 - 例如在编辑时设置初始值,如果是这样,请告诉我,以便我们也可以进行编辑。

于 2013-10-29T19:23:41.627 回答
-1

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

于 2013-10-29T05:50:57.367 回答