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 に答える