【Python】Django学習でまずは頭に入れておきたい汎用ビュー

プログラミング初心者の私が、
PythonのフレームワークであるDjangoを使って
ウェブアプリケーションを開発するまでの記録を記事にしています。

過去のプログラミング関連記事も併せてお読みいただけると幸いです。

関連過去記事

さて今回は、

Djangoの学習、というより制作に行き詰ってしまったので、
今の現状について記事にしておこうと思います。

テキストの書き写しだけでは限界があった

過去の記事で、

プログラミング学習はまず手を動かして書いてみるのが一番!

とご紹介しました。

しかし、テキストやウェブサイトで調べて、コードを書き写すだけでは、
開発を始めたときに、どのようにコードを書いていけばいいのかわからなくなってしました。

感覚的には、
英会話で相手が言っていることはなんとなくわかるんだけど、
実際に自分がしゃべろうとすると、英語が全く出てこない。

というような感じです。

なんとなく、書いてることは理解できるのですが、
自分が実現したいプログラムを書こうとしたら、
どう書けばいいのかわからない、想像もつかないという状態になりました。

さらに、ウェブアプリ開発をする場合、
複数のファイルを扱い、それぞれのファイルの関係性や
ファイルの位置関係(ディレクトリ)などを明示しないといけません。

単独のファイルをコーディングするよりもはるかにレベルが上がり、
何とかプログラムを書いたとしても、
エラーが発生した場合に、対処ができなくなってしまいます。

このような状況に陥ってしまったため、
今現在、とても困っているわけです。

しばらくいろいろと調べてみたり、
自分なりに対処してみて、少し前進しそうなので、
同じ状況の方は是非参考にしてみてください。

行き詰った状況を整理

ウェブアプリの開発をするにあたり、

まずは、ログインやログアウト、サインアップなどの機能を作って、
そこから少しずつ機能を追加しようと思いました。

そこで、まず初めに下記の記事を参考にして、
ログイン・ログアウトとサインアップの機能を実装しました。

djangoチュートリアル #9 ログイン

djangoチュートリアル #10 サインアップ

https://github.com/shun-rec

といっても、この方の記事を参考にして、
書かれている通りにコーディングするだけで、実装が完了します。

このやり方がまずかったです。

PythonやDjangoのこと、基礎的な知識がなくてもできてしまうので、
機能拡張をする際に、どこをいじればいいのか分からなくなります。

ネットや書籍で調べてみると、参考記事は見つかりますが、

そのまま転記しただけでは当然ダメで、

今作っているプログラムに流用するなら、どこを書き換えたらいいのか?
どんなコートを追記したり、変更したりするべきなのか?

ということがわからない状態です。

さらに、プログラム全体のファイル同士の関係性を理解していないため、
既存のプログラムを機能拡張させて、正常に動作するものをつくるのは難しいと判断しました。

完全コピーはできるけど
応用がきかないという、残念な状態なので、
何とかして、自力でコーディングできるようにせねばと、
基礎から勉強をやり直すことにしました。

すべてのコードを紙に印刷

ここでまずやったことは、
今ある既存のプログラム(完全コピーしたもの)を
すべてテキストファイルにコピペして紙に印刷しました。

そして、印刷した紙を
ディレクトリの階層と同じ配置になるように床に並べました(笑)

なにがしたかったかというと、
各ファイルの関係性を可視化したかったんです。

Djangoではユーザーが任意のURLにアクセスした際に

「そのURLなら、こっちのファイルを見に行ってね」

と定義するところがいくつかあります。

そして、参照した先のファイルでは、

「データベース管理ファイルを見に行ってください。」
「次に表示させるHTMLはあそこにあります。」
「ここで使用している関数は別のファイルに保存されてますよ。」

というように、ばらばらのファイルを参照するようになっています。

参照先のファイル名が間違っていたり、
保存先が正しくなかったり、
そもそもファイルに関する記述が抜けていたり、

とても些細なミスであってもプログラムを動かすとエラーが発生します。

スペルミスであればエラーも見つけやすいのですが、
必要なコードそのものが書かれていないことでエラーになると、
原因を見つけるのにかなり苦労します。

なので、
まずは紙に書かれたコードを見ながら、

「このコードはどのファイルを見に行っている」
「これを書いたら、あれとそれのファイルに教えてあげないといけない」
「すべてのファイルの位置関係を正しく教えてあげなる必要がある」

などの、ごくごく当たり前のことを理解するために印刷しました。

基礎からしっかりと勉強された方にとっては、

「なんだそんなことか」と思うかもしれませんが、

コードを書き写して実践的な勉強(もはや勉強ではないですね)をしてきた私にとっては、
プログラムを書いて(というかそのままコピーして)動くものを作っていたので、
習得しているような気になっていましたが、

実際は、本当の意味では理解できていないということがよくわかりました。

汎用ビューを学ぶことにしました

さて、紙に書いたコードを眺めながら、

記述の参照先をたどって、紙の上をあっちに行ったりこっちに行ったりしていると、
行き先がなくなるところに直面しました。

それが汎用ビューでした。

コードの中では、
from django.views.generic import TemplateView
と書かれていたりします。

これは、Djangoに用意されているViewに関する汎用(generic)機能のなかから、
TemplateViewというものを使う宣言をするコードです。

この汎用ビューがあるおかげで、
よく使う処理のコードを書かなくても呼び出して宣言するだけで
機能が使えるという便利なものなのですが、

どんな種類があって、何ていう名前なのかは知っておかないと使うことができません。

また、これらは頻繁に出てくるため、
誰かが参考として公開してくれているコードであっても、
ここを知っておかなければ、何をしているのかわからないわけです。

私が一番最初に行き詰ったのはTemplateViewです。

他にもCreateViewやListViewな、いろいろな汎用ビューがあるので、
ある程度は存在を知ったうえで、どのように機能するのかを把握しておく必要があるなと感じました。

これらの情報はネット上にたくさんあるので、
そこから情報収集をしています。

この記事ではそれぞれのビューがどんな使い方をするのかは紹介しませんが、
参考にしている記事を一つ共有しておきますね。

参考記事

Djangoにおけるクラスベース汎用ビューの入門と使い方サンプル

汎用ビューを理解していないと、何が書かれているのか全く分からなくなります。

例えば参考記事のListViewにこのようなコードが書かれています。

from django.views.generic import ListView
from foo.model import MyModel

class MyListView(ListView):

    model = MyModel

引用元:https://qiita.com/dai-takahashi/items/7d0187485cad4418c073

この記述があることで、データベースの情報を一覧表示することができます。

プログラミングをある程度勉強されている方にとってはお馴染みの記述かもしれませんが、
プログラミング初心者にとってはこの記述だけで、一覧表示が作れるとは思ってもいませんでした。

そしてこの汎用ビューというのがコピーしたコードのいたるところに登場します。

また、自分が作ろうとしているプログラムにも
汎用ビューをどんどん活用しないと
プログラム自体が煩雑になり、管理が大変になります。

汎用ビューで実現できない部分は、自分でコードを書かないといけないのですが、
極力負担を減らすためにも、汎用ビューの習得はしっかりしておいた方がいいでしょう。

まとめ

今回の記事では、私がプログラミングに行き詰った経緯と
そこから判明した汎用ビューの重要性についてまとめました。

過去の記事で紹介した参考書では、
class based view と function based viewという紹介をされているのですが、
私の理解が及んでいなかったようです。

参考書に記載があることなので、すべて重要なことなのはわかりますが、
実際に問題として直面してみないと、なぜ重要なのかわからないもんですね。

これからしっかり勉強しなおして、
プログラム開発の次のステップに進みたいと思います。

というかまさに今、参考書を読み直してみて、
なるほどと思うポイントが結構あることに気づきました。

参考書やネットの記事は同じものを何度も読み返して
新たな発見を得ながら勉強するのも大切ですね。

少しずつですが、プログラミングスキルを伸ばしていこうと思いますので、
私と同じようにプログラミング学習をしている方は一緒に頑張りましょう!

最後まで読んでいただきありがとうございました!

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です