Django:The Model名 could not be changed because the data didn’t validate.エラーの原因と対策

Django:The Model名 could not be changed because the data didn’t validate.エラーの原因と対策

Django:The Model名 could not be changed because the data didn’t validate.エラーの原因と対策

これは私がCRUD作成の一番最初に苦しめられたエラーです。

POSTされた値のカラム名がForm / ModelFormと合致していないときに発生します。
エラー発生原は様々ですが、私の場合は下の組合せが原因でした。

  1. Models.py 内で【models.DateField(null=True, default=None)】としたフィールドに対し何も入れずにPOSTした。
  2. Models.py 内で【models.IntegerField(null=True, default=None)】としたフィールドに対し何も入れずにPOSTした。
  3. Models.py 内で【RegexValidator(regex=r’^[0-9]+$’)】としたフィールドに対し何も入れずにPOSTした。
  4. POSTしたリレーションカラム名がModel内の名称と違っていた

POSTされた値が文字列ではない時やリレーションを張っているカラムが存在する時、このエラーの発生率は高まります。

なにも記載しないでPOSTした場合、[ ’’ ]や[ ‘None’ ] がPOSTされている

Validateのエラーはこのような空データが原因となっている事が多いようです。
回避する手段については以前も少し触れましたが2つあります。

  1. Form / ModelFormのバリデーションを使わない。
  2. POSTされた[ ” ] や [ ‘None ] を置換してからForm / ModelFormのバリデーションにかける

最適解としては外部関数としてlibrary.pyなどに下記コードを登録し利用したうえでバリデーションに掛ける事です。

上に記載した私が経験した原因の1~3はこれでクリアできます。

POSTしたリレーションカラム名ってなに?

この6行目【customer = models.ForeignKey(CustomUser, on_delete=models.CASCADE…)】がリレーションのテーブルです。このリレーションは今『1対多』で組んでいます。

注目はcustomer_idではなくcustomerで登録している事です。

LaravelではSQLテーブルの姿をそのまま記載するのでカラムの呼び出しは【customer_id】とすることが基本ですが、Djangoは [ _id ]を付ける作業を勝手に行ってくれます。

なので、このようにmodels.pyに書いた場合、migrationするとMySQLには【customer_id_id】というカラムが出来上がります。

ModelFormを使う場合、Modelに登録した名称が正

MySQL内のカラム名がcustomer_idになっていてもcustomeruser_idになっていても、Modelに存在していなければバリデーションエラーが発生します。

models.pyにcustomer と記載しているならTemplate.htmlでは【<imput name=’customer’ …>】でPOSTしてあげましょう。

まとめ

ここら辺のエラーは多分みんなが通る道なのだろうなと思います。

慣れればなんてことはないんですけどね。