Django:CRUD 新規追加しようとしたら app/model_form.html とエラー発生

Django:CRUD 新規追加しようとしたら app/model_form.html とエラー発生

Django:CRUD 新規追加しようとしたら app/model_form.html とエラー発生

よく考えたらブログ内にDjangoのCRUD書いてないなと思い記載することにしました。
まずは私が躓いたErrorについてです。

『アプリ名/モデル名_form.html』が無いと怒られる

はい?ググってもそんなTemplateが必要だとどこにも記載されてないです。
しょうがないので言われた通り(空ファイルですけど)用意してみます。
案の定、新規追加はできないまま。もうね、すごく悩みました。

非常に参考になったのがこちらのサイトです。
このエラーについては『TemplateDoesNotExist』というキーワードで検索すると多くの情報が出てきます。

私の場合の根本原因

原因:POSTした値のnameが違っていた

私の場合はコレでした。
具体的には『<input name=”types” …>』と書かないといけないのに『<input name=”type” …>』と書いてたというね。

なぜ POSTのNameを間違えたのにTemplateDoesNotExistエラー?

参考サイトさん曰く表示するページが存在しない場合に発生するエラーとの事ですが、なぜnameの間違いでこのエラーが発生したのでしょう。
nameの間違いとページの存在は関係ないような…。

私はこのエラーが発生した時、下の様な実装をしていました。

  1. app_02からapp_01の Model と Form をuse (※ app_02のviewsで import)
  2. update/createの動作をapp_02から実行。その際にapp_01のforms.pyに記載したClassを呼出して処理

アプリを跨いだ処理です。で、updateは上手く処理されて、createだけTemplateDoesNotExistエラーが発生しました。
この時点で次の事が確定です。

  • app_02 からapp_01のModel/Formを呼び出す設定は正しい(間違えていない)
  • createとupdateの間で異なるパーツに問題がある

上に書いた通り、私の場合の根本原因はNameの間違いでした。
ここで不思議に思ったのがエラーで「無い」と指摘された【アプリ名/モデル名_form.html】のアプリ名です。

app_02から呼び出しているので『app_02/model_form.heml』なのかと思いきや『app_01/model_form.heml』が無いと言われています。という事は、app_01/forms.pyの指定したClassまでは届いていて、そこから『遷移すべきページが無い』と言われているわけです。

ここまで考えると気付きますよね。

ValidationCheckで不備が見つかったから返そうと思ったのにapp_01に該当ページが無い

そりゃね、Veiw関連はapp_02で書いてるもん。そんな理由からPost.Nameの間違いでTemplateDoesNotExistエラーが発生したようです。

TemplateDoesNotExistエラーが発生する原因とみるべき場所

今回の私の例を除き、TemplateDoesNotExistエラーの原因として挙げられるのは次の4つです。

  1. settings.pyのtemplateの記述が悪い
  2. views.pyのrender関数等のページを指定するものの指定の仕方が悪い
  3. urls.pyの記述が悪く、views関数がうまく拾えていない。
  4. templatesフォルダの場所が悪い

この4つに関してはこちらのサイトが参考になると思います。

これに今回の私の例を加えます。

5. form.py/models.py でErrorがcallされた時の遷移先が無い。

5が発生する具体的な例はこんな場合です。

  • POSTされたNAMEに見知らぬカラムが格納されている (type なんて存在しないのに typeがあるとか)
  • POSTされたNAMEに格納できない値が渡されている (number なのに str とか)
  • POSTされた値がmodels.pyで定義したValidationと合致していない (特にSQLにNULLが入っている場合、”None”という文字列がPOSTされてくるので要注意 )

__init__() takes 1 positional argument but 2 were given

これもPost.Nameの間違いで発生しやすいエラーです。
まずは翻訳してみましょう。

__init__()は1つの位置引数を取りますが、2つの引数が与えられています。

エラーメッセージが的確に指示してくれてますね。

  • POSTされたNAMEに同じNameが存在している(2はダブってるよという意味、3だったら同じNameが3つPOSTしてる)

まとめ

こういうのって以前書いたコードをコピペした時に発生しがちです。

「しかり見て確認した」と自信たっぷりでも他の原因を探さず徹底的に『スペルミス』や『Nameの重複』を確認しましょう。