Django:CRUD 新規追加しようとしたら app/model_form.html とエラー発生
Django:CRUD 新規追加しようとしたら app/model_form.html とエラー発生
よく考えたらブログ内にDjangoのCRUD書いてないなと思い記載することにしました。
まずは私が躓いたErrorについてです。
『アプリ名/モデル名_form.html』が無いと怒られる
はい?ググってもそんなTemplateが必要だとどこにも記載されてないです。
しょうがないので言われた通り(空ファイルですけど)用意してみます。
案の定、新規追加はできないまま。もうね、すごく悩みました。
非常に参考になったのがこちらのサイトです。
このエラーについては『TemplateDoesNotExist』というキーワードで検索すると多くの情報が出てきます。
私の場合の根本原因
私の場合はコレでした。
具体的には『<input name=”types” …>』と書かないといけないのに『<input name=”type” …>』と書いてたというね。
なぜ POSTのNameを間違えたのにTemplateDoesNotExistエラー?
参考サイトさん曰く『表示するページが存在しない場合に発生するエラー』との事ですが、なぜnameの間違いでこのエラーが発生したのでしょう。
nameの間違いとページの存在は関係ないような…。
私はこのエラーが発生した時、下の様な実装をしていました。
- app_02からapp_01の Model と Form をuse (※ app_02のviewsで import)
- 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までは届いていて、そこから『遷移すべきページが無い』と言われているわけです。
ここまで考えると気付きますよね。
そりゃね、Veiw関連はapp_02で書いてるもん。そんな理由からPost.Nameの間違いでTemplateDoesNotExistエラーが発生したようです。
TemplateDoesNotExistエラーが発生する原因とみるべき場所
今回の私の例を除き、TemplateDoesNotExistエラーの原因として挙げられるのは次の4つです。
- settings.pyのtemplateの記述が悪い
- views.pyのrender関数等のページを指定するものの指定の仕方が悪い
- urls.pyの記述が悪く、views関数がうまく拾えていない。
- 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の重複』を確認しましょう。
-
前の記事
Django:別アプリのmodels.pyに書いたテーブルを使う時のimport方法と注意点 2021.02.05
-
次の記事
Django:2タイプのCRUD記載方法について特徴と注意事項のまとめ 2021.02.08
コメントを残す