【Django】TemplateResponseMixin requires either a definition of ‘template_name’ or an implementation of ‘get_template_names()

【Django】TemplateResponseMixin requires either a definition of ‘template_name’ or an implementation of ‘get_template_names()

【Django】TemplateResponseMixin requires either a definition of ‘template_name’ or an implementation of ‘get_template_names()

こんなエラーが出てきたので翻訳機に掛けてみました。

TemplateResponseMixin requires either a definition of ‘template_name’ or an implementation of ‘get_template_names()

TemplateResponseMixin は ‘template_name’ の定義か ‘get_template_names() の実装を必要とします。
(意訳)TemplateResponseMixinと言う所にデータが渡ってきたけど必要な情報揃ってないよ。

今回解決に至った方法

Views.py で継承しているクラスを確認し適切なものに変更

まぁね、まだまだな訳です。
Django初心者、参考図書のルート上にある事はやりたい様に動かせても、テキストのルートを少し外れると不明な事ばかりです。今回はそんな問題の一端でした。

この中の28行目【class ServiceView(generic.FormView):】を【class ServiceView(generic.FormView):】と修正するとエラーの発生はなくなります。

この方法だと website/service.htmlに記載した値をurl.pyで関連付けたアドレスで表記してくれます。

こんな感じでurls.pyを書いていれば、https://ドメイン/service にアクセスすれば websites/service.html を表示します。でもやりたのはそこじゃないんです。

FormView と書いてみたのはDBに格納した値を表示したかったからなんですよね。

WordPressのようにSQLにHTMLを格納しページに表示するための構成

今回はSQLに【 contents 】というテーブルを用意し次のようなフィールドを用意しました。

  • types:記載ページを指示(informationかserviceかといったフラグ)
  • name:記載内容(contents)のタイトル。WEBに表現する時はhタグをつけて飾る予定
  • contents:記載するHTMLを格納する場所。bootstrapのルールに従っておけばテンプレート変更で色々変更出来るはず。
  • sort_number:typesの中の並び替え。コンテンツを小分けにした方が融通を利かせられるので用意。
  • switch:WEBへの表示対象とするかを表すマーカー。Falseにしておけば表示しないのでWEBサイトの変更に活用できる。

これをmodels.pyに表現するとこんな感じ。

この状態でマイグレーションを実行すれば設定したSQLサーバーにテーブルを作成してくれます。
Djangoではこうしてmodels.Model に紐づけたテーブル構成はQuerySetとして扱う事が出来る様です。
で、Views.pyではこのQuerySetを呼出して欲しい値の抽出を行います。

この時のurls.pyは下のようにします。

これで、https://ドメイン/service にアクセスしてきた場合 contentsテーブルの値にフィルターかけて抽出したものをservice.htmlに渡して表示する事が出来ます。

CMSの原型がこれで完成です。

まとめ

ここまででなかなか手こずったのは【class】と【def】の違いと記載方法でした。

Laravelを道具にしてた私からすると【def】の書き出しになじみがなく、全てClassで書いていたのですが[ class ServiceView(request): ] とするとエラーなんですよね。classではrequestを呼び込めないのか、動線が異なるのか、ここら辺はまだ「理解してる」と言い難いです。

まぁ作りながら理解してくしかないですね。
今日も頑張りましょう!