知識の枝

"All is well"

Django App追加時の設定書き換え方法

約438日前 2020年9月14日17:30
デジタル
Django

改訂履歴


2020/9/14 投稿

1. 背景


既にDjangoにメインアプリが存在し、追加でアプリを作成したい場合の話です。

既存のDjangoプロジェクトにアプリを追加する際のコマンド
「startapp」を実行後の設定ファイルの書き換え方法を解説します。

2. 目的


追加アプリで作成したhtmlをブラウザで表示する。

3. はじめに


今回は開発サーバー(runserver)でやり方を説明しますが、実際の公開サーバーでもやり方は同じです。

4. アプリの追加


4.1 - アプリ作成


Pythonの仮想環境に入り、manage.pyがあるフォルダで下記コマンドを実行しましょう。
※下記例では「testapp」という名前のアプリを作成しています。
※仮想環境が何か分からない方はこちらを参照下さい。
(myvenv) C:\~~~\プロジェクトフォルダ> python manage.py startapp testapp


アプリが作成されました。
「testapp」というフォルダ内には以下のファイルが生成されていると思います。



4.2 - settings.pyの設定


アプリを作成したので、「settings.py」に教えてあげましょう。
INSTALLED_APPS = [
'blog.apps.BlogConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.sitemaps',
'testapp.apps.TestappConfig' #追加した一文
]

「INSTALLED_APPS」という項目に追加しましょう。

書き方は下記の通りです。
「'アプリ名.apps.アプリ名Config'」
※2つ目の「アプリ名」の最初は大文字

4.3 - config/urls.pyの設定


「config/」部分は「settings.py」が置いてあるフォルダです。
(人によって異なります)

「urlpatterns」項目に下記一文を追加しましょう。
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), #メインのアプリ(このブログです)
path('testapp/', include('testapp.urls')) #追加した一文
]

ブラウザで「/testapp」にアクセスがきたら「testappフォルダのurls.pyを参照する」という内容です。

4.4 - testapp/urls.pyの設定


「config/urls.py」で参照される側のファイルを作成します。
初期状態では「urls.py」が生成されていないので作成しましょう。
※作り方は自由です。urls.pyという空のファイルを取り合えず作ればOKです。

作ったファイルの中身に下記コードを記載しましょう。
from django.conf import settings
from django.urls import path, include
from . import views

app_name = 'testapp'

urlpatterns = [
path('', views.AppIndexView, name='appindexview')
]

重要なのは「patterns」に書いた一文で、
「''」にアクセスが来たら「views.pyファイルのAppIndexView関数を実行」という内容になります。

「''」というのは「/testapp」のことを指します。
「AppIndexView」の部分は何でも良いのですが、アプリのトップページのビューなのでこのような名前にしました。

【エラーの元になる失敗例】
私が実際に失敗した内容を例として挙げます。

■path部分に2重記載
「/testpp」にアクセスするならパスは「'/testapp'」だろうと思っていました。
urlpatterns = [
path('/testapp', views.AppIndexView, name='appindexview')
]

でもこれだと「Page not found (404)」エラーが出ます。
※setting.pyの設定で「DEBUG=True」にしているとエラーメッセージを確認できます。



上記の書き方では
「/testapp/testapp」という意味になってしまっているのではないか?
と勝手に思っていますが、実際に「/testapp/testapp」にアクセスしても同じエラーが出たので何が起こっているのか理解できていません。
分かる方がいらっしゃいましたら教えて頂きたいです。

4.5 - testapp/views.pyの設定


「testapp」フォルダ内の「views.py」を開き、下記内容を記載しましょう。
from django.shortcuts import render
from django.http import HttpResponse

def AppIndexView(request):
return render(request, 'testapp_index.html')

先ほど指定した「AppIndexView」関数が書かれています。

中身は「testapp_index.htmlファイルを開け」という内容です。

上記ではhtmlファイルのパスを指定していませんが大丈夫です。
Djangoでは自動でアプリ内の「templates」フォルダの中身を探してくれる仕様になっています。

4.6 - htmlの作成


最後に表示するhtmlファイルを作成しましょう。
作成する場所は「testapp」フォルダ内に「templates」という名前のフォルダを作り、その中に作成します。
今回の例では「testapp_index.html」という名前のファイルを作成します。

htmlファイルの中身は仮に下記を記載しましょう。
{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>テストアプリ</title>
</head>
<body>
<p>Main</p>
</body>
</html>

最低限のタイトルと本文のみ作りました。

設定は以上です。

5. 動作確認


下記コマンドを実行し、開発サーバーを起動しましょう。
(myvenv) C:\~~~\プロジェクトフォルダ> python manage.py runserver

下記URLをブラウザで開いてみましょう。
※違うアプリ名の方は書き換えてアクセスして下さい。
http://127.0.0.1:8000/testapp



ブラウザで「Main」と表示されていたら設定は問題無しです。

以上がアプリ追加時の設定方法です。
うまく動作しない場合はコメント下さい。

お疲れ様でした。