【Djangoの始め方をまとめてみました。】

 今回、Djangoの始め方をまとめてみましたので投稿いたします。Windows11とVSCodeを使用しています。pipが使える環境を想定しています。

 後ほど細かく見ていきますので差し当たってやることを列挙します。



全体的な流れ


    仮想環境の構築Djangoのインストール

    

    shellの起動プロジェクトの作成アプリの作成アプリをsettings.pyに登録index.htmlの作成views.pyでindex.htmlの呼び出しアプリ名/urls.pyを作成しviews.pyのclassを呼び出すプロジェクト名/urls.pyでアプリ名/urls.pyを呼び出す
    



実際のコード

 気を引きたいところには色付けしています。同じ色のところは同じ意味合いのものとしてとらえてもらえればよいかと思います。


    #仮想環境の構築
    pip install pipenv
    pipenv install
    

    #Djangoのインストール
    pipenv install Django
    

    #shellの起動
    pipenv shell
    

    #プロジェクトの作成
    django-admin startproject プロジェクト名
    

    #アプリの作成
    cd プロジェクト名
    python manage.py startapp アプリ名
    

    #アプリをsettings.pyに登録
    INSTALLED_APPS = [
          .
          .
        'アプリ名',
    ]
    

アプリ名ディレクトリ内にtemplates/アプリ名ディレクトリを作成しその中にindex.htmlを作成


    #index.htmlの作成
    <h1>Hello World!</h1>
    

    #views.pyでindex.htmlの呼び出し
    from django.views.generic import TemplateView
    class IndexView(TemplateView):
        template_name = 'アプリ名/index.html'
    

    #アプリ名/urls.pyを作成しviews.pyのclassを呼び出す
    from django.urls import path
    from .views import IndexView
    urlpatterns = [
        path('', IndexView.as_view()),
    ]
    

    #プロジェクト名/urls.pyの編集
    from django.contrib import admin
    from django.urls import path, include
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('アプリ名.urls')),
    ]
    

ここでpython manage.py runserverしてブラウザでhttp://127.0.0.1:8000/に接続するとHello World!が表示されます。




 それでは細かく見ていきます。上記で分かった方はこれ以降は見なくて大丈夫と思います。

仮想環境の構築

 まず、VSCodeを起動してどこでもいいので任意のフォルダーを開きます。Shift + Ctrl + @ で新しいターミナルを開きます。ターミナルを開くだけなので他の方法でも構いません。ターミナルがPowerShellで立ち上がっていることを確認してください。

 次にpip install pipenvとしてください。pipenvのインストールが始まります。


    #仮想環境の構築
    pip install pipenv
    pipenv install
    

 pipenvのインストールが終わりましたらpipenv installとします。この時ERRORが出るようでしたら、以前にpipenvをインストールされていたのかも知れませんのでpipenv --rmとして削除してみてください。処理が終わりましたら再度pipenv installとします。指定したフォルダーにPipfileとPipfile.lockという2つのファイルができています。


    #Djangoのインストール
    pipenv install Django
    

 次にpipenv install djangoとします。これでDjangoの開発環境が整いました。このフォルダの中に練習用のプロジェクトや本番用のプロジェクトを作成して行くことになりますので、これから先はこの環境構築の作業は必要なくなります。



プロジェクトの作成

 まず、pipenv shellでshellを起動します。


    #shellの起動
    pipenv shell
    

 次に、プロジェクトを作成します。プロジェクト名は proj01 とします。公式チュートリアルでは「mysite」がこれに当たります。


    #プロジェクトの作成
    django-admin startproject proj01
    

 するとproj01フォルダー内にもう一つproj01フォルダが作成された状態になります。

 次に、cd proj01でプロジェクトフォルダー内に移動しアプリを作成します。cdなどのコマンドの後でフォルダー名やファイル名の始めの1~3文字を入力してからTabキーを押すと候補を表示してくれますので入力ミスを防ぐことができます。アプリ名は app01 とします。公式チュートリアルの「polls」がこれに当たります。


    #アプリの作成
    cd proj01
    python manage.py startapp app01
    

 もしもエラーになる場合はls(エルエス)コマンドで確認してみて下さい。manage.pyが無いフォルダー内で作業しているかも知れません。python manage.pyはmanage.pyファイルを実行するコマンドですので同じフォルダ内に移動してからpython manage.pyを実行してください。

 次にsettings.pyにアプリを追加します。settings.pyはプロジェクト(proj01)内の更にproj01の中にあります。


    #アプリをproj01/proj01/settings.pyに登録
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    

 これを忘れてしまうとDjangoがapp01を認識できませんので、これから使用するアプリフォルダー内のviews.pyやurls.pyを使ったコマンドが実行できなくなりエラーになります。また、'app01'の後の「、(カンマ)」を忘れないようにしてください。プロジェクトフォルダー内のsettings.pyやurls.pyなどのファイルについては使う頻度が少なく、アプリフォルダー内のファイルで作業することが多いので、ここにあることをしっかり覚えておくとよいと思います。

 次に、アプリフォルダ内にtemplatesフォルダを作成し、さらにその中にアプリ名フォルダを作成します。その中にindex.htmlを作成します。とてもややこしいですが結果的に「proj01/app01/templates/app01/index.html」となります。


    #proj01/app01/templates/app01/index.htmlの作成
    <h1>Hello World!</h1>
    

 ここではtemplatesの最後の「s」を忘れないようにして下さい。

 このindex.htmlを呼び出す様にviews.pyを編集します。


    #views.pyでindex.htmlの呼び出し
    from django.views.generic import TemplateView
    class IndexView(TemplateView):
        template_name = 'app01/index.html'
    

 公式チュートリアルではrenderを使って順を追って解説されています。しかしながら結果的にTemplateViewを使うことになると思うのでここではTemplateViewで進めていきたいと思います。でも、viewを解釈する上でrenderからの進め方はとても大切だと思いますので、ぜひご自分で公式チュートリアルを読み進めてください。import文はほとんど書き変わっています。また、「def」ではなく「class」であることに注意してください。IndexViewはクラス名ですので任意の文字列で構いません。ご自分で決めてもらって大丈夫です。IndexViewクラスはTemplateViewを継承していますので、TemplateViewで定義されているシステムを使用することができます。template_nameはそのシステムの中のひとつで呼び出すhtmlファイルを指定することができます。htmlを指定するときはアプリ名(app01)を付けることを忘れないでください。このアプリ名はtemplatesフォルダー内のアプリ名になります。

 次に、このviews.pyで指定したIndexViewクラスを呼び出します。アプリフォルダ内にurls.pyを作成しIndexViewを指定します。アプリフォルダ内にはurls.pyがありませんので新たに作成します。


    # app01内にurls.pyを作成しviews.pyのclassを呼び出すコードを記入
    from django.urls import path
    from .views import IndexView
    urlpatterns = [
        path('', IndexView.as_view()),
    ]
    

 プロジェクトフォルダー内のurls.pyとは別のファイルですので注意してください。プロジェクトフォルダー内のurls.pyを使用する事はかなり少ないのでほとんどの場合こちらのアプリフォルダ内のurls.pyでの作業になります。import文内の「from .views」で同じフォルダー内のviews.pyを指定して、views.pyの中にあるIndexViewクラスを呼び出しています。urlpatternsのurlの後には「s」は付きませんので注意してください。pathの後の「''」は「localhost:8000」の後に何も指定しなければという意味です。TemplateViewを使用する場合は「.as_view()」を指定する必要があります。path()の後の「、(カンマ)」を忘れないようにしてください。

 次にプロジェクトフォルダー内のurls.pyを編集してアプリフォルダ内のurls.pyで指定したIndexViewクラスを呼び出します。


    #プロジェクト名/urls.pyの編集
    from django.contrib import admin
    from django.urls import path, include
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('app01.urls')),
    ]
    

 このurls.pyは元からプロジェクトフォルダー内にありますので編集だけで大丈夫です。前半はコメントが大量に書かれています。コメントは削除してしまって構いません。プログラムの実行に必要なのは一番下の数行だけです。  django.urlsから「include」をインポートしています。デフォルトではブラウザのアドレスバーでlocalhost:8000/adminをリクエストするとDjangoの管理画面が表示されるように設定されています。この「path('admin/', admin.site.urls),」の下の行に「path('', include('アプリ名.urls')),」を追加します。そうすることで上から順番にコマンドが実行され、リクエストでadminがヒットすると管理画面が呼び出され、何もヒットしなければapp01.urlsが呼び出されることになります。

 次に、ターミナルでpython manage.py runserverを実行してブラウザのアドレスバーにhttp://127.0.0.1:8000/と入力するとHello World!と表示されます。



 もし、エラーが出る場合は

  • htmlファイルを入れるフォルダーのtemplatesフォルダー名に「s」を忘れていませんか?
  • views.pyのtemplate_nameの指定でアプリ名は付けてますか?
  • views.pyのクラス名の指定で大文字小文字などのタイプミスはありませんか?
  • アプリフォルダー内のurls.pyで「s」を忘れていませんか?
  • アプリフォルダー内のurls.pyのurlpatternsのurlに「s」が付いていませんか?
  • アプリフォルダー内urls.pyのTemplateViewを使用する際のpathの指定で「.as_view()」を忘れていませんか?
  • プロジェクトフォルダー内のurls.pyにincludeはインポートしてますか?
  • settings.pyのINSTALLED_APPSにアプリは追加しましたか?

 ざっと、私が経験したエラーはこれぐらいだと思います(w)。他はあらかじめ準備されているものやVSCodeの予測変換が補完してくれるのでミスは少ないと思います。以上になります。





 分かりにくい部分などありましたらお知らせ頂けると助かります。お知らせいただいた内容は公開されることはありません。どの記事から投稿されたかは分かるようにしています。