2016-09-28 5 views
4

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を期待しているだろう。私はNonech2を強制する場合は、しかし、それはエラーが発生します:

>>> 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ですのデフォルトデフォルト値は空の文字列""があるようです。これには、ドキュメントの説明が必要な場合があります。

+0

元の投稿:http://stackoverflow.com/questions/39714214/missing-required-charfield-in-django-is-saved-as-empty-string-and-do-not-raise-a – clapiotte

答えて

0

二つのフィールドch1ch2は常に、あなたのケースで必要とされるため、すべてを行う必要が

from django.db import models 

class Essai(models.Model): 
    ch1 = models.CharField(max_length=100) 
    ch2 = models.CharField(max_length=100) 

class EssaiModelForm(forms.ModelForm): 
class Meta: 
    model = Essai 
    fields = ['ch1', 'ch2'] 
としてフォームのフィールドが含まれているモデルは、そのような変更であります

Djangoは自動的にこのフィールドの検証エラーを発生させますis_valid()

またはdisalloこれらのフィールドblank=Falseへワット空の文字列の入力が

がモデルにやや顕著な違いがあり、このDjango - how to set blank = False, required = False

0

を参照してください動作しません、それはフォームのです。 Model.save()は検証を実行しません。だから失敗すればおそらくデータベースレベルのIntegrityErrorが発生します。データベース層での失敗のリスクを減らすために、ここではdjango's validating objectsに記載されているModelFormによって行われるModel.full_clean()を呼び出す必要があります。

私の意見では、ModelFormsはクライアントが入力したデータの検証と保存を目的としていると私はdjangoから期待しています。プログラムでインスタンス化されたモデルは、データベースに保存する前に同じコントロールに従う必要があります。

関連する問題