我有一个带整数字段的模型,并希望有一个替代的表单输入呈现而不是默认的文本框,所以我有以下内容:
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,我目前处于亏损状态。
我引用了以下材料,但仍无法弄清楚该怎么做:
感谢您的帮助和意见。
答案 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。这是一个更好的选择。