Django 1.10で不完全なモデルインスタンスを保存しようとすると、Djangoでエラーが発生することが予想されます。それは事実ではないようです。フォローアップ:djangoで必要なCharfieldが見つからないModelformが空文字列として保存され、エラーが発生しない
models.py:
from django.db import models
class Essai(models.Model):
ch1 = models.CharField(max_length=100, blank=False)
ch2 = models.CharField(max_length=100, blank=False)
だから私は二つのフィールドは空であることを許可していない(デフォルトの動作、NOT NULL
制限はMySQLのテーブルの作成時ジャンゴによって適用されます)。私はフィールドのいずれかが格納する前に設定されていない場合、Djangoはエラーを発生させることを期待しています。
しかし、私は不完全なインスタンスを作成するときに、データがうまく保存されています。
>>> from test.models import Essai
>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.save()
>>> bouh.id
9
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
''
>>>
私はエラーを発生させるためにはDjangoを期待しているだろう。私はNone
にch2
を強制する場合は、しかし、それはエラーが発生します:
>>> bouh = Essai()
>>> bouh.ch1 = "some content for ch1"
>>> bouh.ch2 = None
>>> bouh.save()
Traceback (most recent call last):
(...)
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: test_essai.ch2
>>> bouh.id
>>> bouh.ch1
'some content for ch1'
>>> bouh.ch2
>>>
は説明:述べたようにSQL空の文字列に""
は、NULLと等価ではないので、Djangoはこの単純なケースでは、デフォルトの動作としてエラーを出されていません https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#selecting-the-fields-to-use
:私たちはのModelFormの行動を見れば今Django model blank=False does not work?
で、Djangoのドキュメントに矛盾があるように思われます
Django will prevent any attempt to save an incomplete model, so if the model does not allow the missing fields to be empty, and does not provide a default value for the missing fields, any attempt to save() a ModelForm with missing fields will fail. To avoid this failure, you must instantiate your model with initial values for the missing, but required fields:(…)
デフォルト値がない場合、modelFormは欠落したフィールドとともに保存しないでください。 class EssaiModelForm(forms.ModelForm): class Meta: model = Essai fields = ['ch1']
唯一のフィールドch1
とフォームが生成されます。だから、これのModelFormで
。
ch1
が空の場合、検証はEssaiModelFormInstance.is_valid()
で期待通りに失敗します。ch1
に値が含まれている場合、ch2
がまだ存在しない場合でも検証は成功します。その場合、EssentialModelFormInstance.save()は成功し、djangoのドキュメントに記載されている内容とは異なります。ch2
は空の文字列であるため、SQL要件(NOT NULL
)と互換性があります。
だから、フォーム検証でを受け入れたが、それは、を保存()検証でを受け入れているされていないCharFieldですのデフォルトデフォルト値は空の文字列""
があるようです。これには、ドキュメントの説明が必要な場合があります。
元の投稿:http://stackoverflow.com/questions/39714214/missing-required-charfield-in-django-is-saved-as-empty-string-and-do-not-raise-a – clapiotte