4

いくつかの方法でラジオボタンとして正常に実装NullBooleanFieldしていますが、問題はデフォルト値を[なし]に設定できないことです。

コードは次のとおりです。

models.py:
class ClinicalData(models.Model):
      approved = models.NullBooleanField()
      ...

forms.py:
NA_YES_NO = ((None, 'N/A'), (True, 'Yes'), (False, 'No'))
class ClinicalDataForm(ModelForm):
      approved = forms.BooleanField(widget=forms.RadioSelect(choices=NA_YES_NO))
      class Meta:
           model = ClinicalData 

次の方法を試しdefault:Noneました。モデルに設定inital:Noneするか、フォームに設定するか、フォームインスタンスのビューに設定します。
それはどれも成功しませんでした。私は現在、CharFieldの代わりに使用していNullBooleanFieldます。
しかし、NullBooleanField???でこの結果を得る方法はありますか?

4

5 に答える 5

8

これはしばらくの間答えられていることを私は知っていますが、私もこの問題を解決しようとしていて、この質問に出くわしました。

エミラーの解決策を試した後、それは機能しているように見えましたが、フォームself.cleaned_dataを見ると、返された値がすべてまたはのいずれTrueかであり、値が記録されNoneていないことがわかりました。False

Djangoコードを調べたところ、通常のNullBooleanField selectは実際にそれぞれにマップNoneされますがTrue、RadioSelectはにマップされ、その他の値はにマップされます。False1231True0FalseNone

これは私が使用することになったものです:

my_radio_select = forms.NullBooleanField(
    required=False,
    widget=widgets.RadioSelect(choices=[(1, 'Yes'), (0, 'No'), (2, 'N/A')]),
    initial=2,  # Set initial to 'N/A'
)
于 2013-08-15T08:47:51.793 に答える
5

奇妙な理由で-私はDjangoコードでそれをチェックしませんでした-NullBooleanFieldのカスタムウィジェットを提供するとすぐに、期待する値(、、または)を受け入れなくNoneなりTrueますFalse

1組み込みのchoices属性を分析したところ、これらの値はそれぞれ、、、2およびに等しいことがわかりました3

だから、これは私がデフォルトとして「不明」を使用してラジオボタンに固執するための手っ取り早い解決策です:

class ClinicalDataForm(forms.ModelForm):
    class Meta:
        model = ClinicalData

    def __init__(self, *args, **kwargs):
        super(ClinicalDataForm, self).__init__(*args, **kwargs)
        approved = self.fields['approved']
        approved.widget = forms.RadioSelect(
            choices=approved.widget.choices)
        approved.initial = '1'

見た目も良くないので、必要な時以外は使いません。しかし、念のためにあります。

于 2012-08-16T18:32:57.150 に答える
1

価値があることについては、ここで示した他の回答はDjango1.7では適用されなくなりました。設定は問題choicesなく[(True, "Yes"), (False, "No"), (None, "N/A")]機能します。

于 2015-02-01T12:48:04.357 に答える
1

Django 1.7の私にとって、デフォルトではNone値は選択されていません(Craigが主張していることにもかかわらず)。RadioSelectをサブクラス化しましたが、私の場合は役に立ちました。

from django.forms.widgets import RadioSelect
from django.utils.translation import ugettext_lazy

class NullBooleanRadioSelect(RadioSelect):
    def __init__(self, *args, **kwargs):
        choices = (
            (None, ugettext_lazy('Unknown')),
            (True, ugettext_lazy('Yes')),
            (False, ugettext_lazy('No'))
        )
        super(NullBooleanRadioSelect, self).__init__(choices=choices, *args, **kwargs)

    _empty_value = None
于 2015-03-06T20:18:13.257 に答える
0

私はDjango2.2でこれを達成しました。

とウィジェットNoneでラジオオプションをチェックできるはずです。秘訣は、選択値を空の文字列に設定することです。ChoiceFieldRadioSelectNone''

私が使用したモデルフィールドBooleanFieldnull=True、基本的にモデルフィールドと同じでしたNullBooleanField

approved = forms.ChoiceField(
    choices=[(True, 'Yes'), (False, 'No'), ('', 'N/A')],
    widget=forms.RadioSelect,
    required=False,
)
于 2020-04-18T01:39:20.813 に答える