4

私はジャンゴ1.5.4を使用しています

これは、私が直面している問題の最小限の例です。

モデル:

#models.py
from django.db import models

class SampleModel(models.Model):
    spam = models.BooleanField()

フォーム:

#forms.py
from django.forms import ModelForm
from .models import SampleModel

class SampleModelForm(ModelForm):
    class Meta:
        model = SampleModel
        fields = ('spam', )

ジャンゴシェルから:

>>> data = {} #intentionally blank
>>> form = SampleModelForm(data)
>>> is_valid = form.is_valid() #is_valid is True
>>> form.save() # model instance is created with "spam" set to False by default.

フォームの検証が間違っていますか? form.is_valid他のタイプのフィールドを正しく検証します。ドキュメントは、すべてのフィールドがデフォルトで必須であることを示していますが、ブール フィールド キーが存在しない状態でis_valid返されます。True

ブール値フィールドが入力データに存在することを確認する必要があります。現在、フィールドが存在し、タイプが であるかどうかを手動で確認していますboolform.is_valid他のモデルでも再利用できるように、このチェックをオーバーライドして追加する必要があると思いますか?

4

1 に答える 1

7

BooleanFieldモデルがメソッドでblank=True自動的に設定されていることが判明しました(コード検査から、ドキュメントには記載されていません)__init__。したがって、自動的に作成されたモデルフォームフィールドは不要になります。これは考慮すれば理にかなっています (False は空白としてカウントされるため、BooleanFieldtrue である必要があります) が、ドキュメントを読んだだけでは明らかではありません。

必須にしたい場合Trueは、通常のフォームフィールドのオーバーライドが適用されます-フィールドを自分で宣言するか、検証する前にそのrequired属性をTrueどこかに設定します(通常はフォームの__init__メソッドを使用します)。Pythonを許可するTrueか許可したくない場合は、より困難です。FalseNone

具体的には、 a の標準ウィジェットBooleanFieldはチェックボックスです。ブラウザーは、チェックされていないチェックボックスに対しては何も送信しないため、チェックボックス ウィジェットは、送信からのフィールドの不在を として扱いますFalse。ユーザーがチェックボックスを選択していない場合と、入力が本当に悪い場合を区別する方法はありません。別のウィジェット ( aRadioSelectなど) を使用して、少なくともブラウザーが に対して何かを送信できるようにすることもできますが、のメソッドが検証前にその値を a に変換するFalseという問題がまだ残っているため、サブクラスとオーバーライド。BooleanFieldto_pythonboolean

幸いなことにFalse、検証コードでは は空と見なされないため、そうすると、カスタム クリーニング メソッドを設定することができ、required=True不要になります。

于 2013-10-11T22:53:33.607 に答える