| この記事の要点 |
|---|
|
エラーの意味
Djangoのurls.pyでURLパターンを書く際に、include()という関数を呼び出しています。しかし、そのincludeという名前がどこからも読み込まれていない(定義されていない)ため、Pythonが「そんな名前は知らない」と判断して次のエラーを出します。
NameError: name 'include' is not defined |
つまりこれは、include()を使う前に その関数をimport(読み込み)し忘れている という、典型的なimport漏れのエラーです。Django固有の難しい不具合ではなく、Pythonの基本的なルール(使う名前は事前に定義・import しておく)に沿った素直なエラーです。
原因
下のように、urls.pyでinclude()を呼んでいるのに、includeをimportする行が書かれていません。
# myproject/urls.py(NG例:include を import していない) from django.urls import path # ← path はあるが include が無い
urlpatterns = [ path('blog/', include('blog.urls')), # ← ここで NameError ] |
よくあるパターンは次のとおりです。
- import行を書き忘れた:
pathだけimportして、後からinclude()を追記したときにincludeを足し忘れた。 - import元を間違えた:チュートリアルやサンプルのバージョンが古く、
django.conf.urlsやdjango.urlsのどちらから読み込むべきか食い違っている。 - 綴り・大文字小文字の誤り:
Include(先頭大文字)など、import名と呼び出し名が一致していない。
解決方法
urls.pyの先頭に、includeを含むimport文を追加します。2026年時点で標準的に使われているDjango 2.0以降では、pathと同じくdjango.urlsから読み込みます。pathも一緒に書いておくのが定番です。
# Django 2.0 以降(現在の推奨) from django.urls import include, path |
これでエラーは解消します。pathもまだimportしていなければ、上記のように1行でまとめてimportできます。
一方、Django 1.x系(古いプロジェクト)では、includeは次のようにdjango.conf.urlsから読み込みます。古い書籍・記事・既存コードを参考にしている場合はこちらになります。
# Django 1.x 系(古い書き方) from django.conf.urls import include, url |
| バージョン | include の import 元 | 主なURL関数 |
|---|---|---|
| Django 2.0 以降(現行) | from django.urls import include, path | path / re_path |
| Django 1.x 系(旧) | from django.conf.urls import include, url | url(正規表現ベース) |
自分のDjangoバージョンが分からない場合は、ターミナルで次のコマンドを実行して確認できます。
python -m django --version |
正しい urls.py のコード例
多くの場合、include()は「プロジェクト側のurls.pyから、各アプリのurls.pyを取り込む(include する)」目的で使います。下は、プロジェクト直下のurls.pyで、blogアプリとaccountsアプリのURL定義を取り込む例です。
# myproject/urls.py(プロジェクト側) from django.contrib import admin from django.urls import include, path
urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')), # blog アプリの URL を取り込む path('accounts/', include('accounts.urls')), ] |
取り込まれる側、たとえばblogアプリのurls.pyは次のようになります。こちら側ではincludeは不要で、pathだけをimportすれば十分です。
# blog/urls.py(アプリ側) from django.urls import path from . import views
urlpatterns = [ path('', views.index, name='index'), path('<int:post_id>/', views.detail, name='detail'), ] |
この構成だと、ブラウザで /blog/ にアクセスするとblogアプリのindexビューが、/blog/5/ にアクセスするとdetailビュー(post_id=5)が呼ばれます。プロジェクト側で'blog/'という接頭辞を付け、アプリ側はそれ以降のパスだけを担当する、という役割分担になっています。
補足:path / re_path とアプリ分割の意味
path:URLを分かりやすい記法で書ける関数です。<int:post_id>のように型を指定して値を受け取れます。通常はこちらを使います。re_path:正規表現でURLを定義したいときに使う関数で、from django.urls import re_pathでimportします。複雑なパターンマッチが必要な場合のみ使用します。include()の役割:URL定義をアプリごとのファイルに分割し、それをプロジェクト側でまとめて取り込むための関数です。これにより、1つの巨大なurls.pyを避けて、機能(アプリ)単位でURLを管理できます。アプリが増えても見通しが良くなり、再利用もしやすくなります。
落とし穴・注意点
| つまずきポイント | 対処 |
|---|---|
| import を書く場所が間違っている import文は urls.pyのファイル先頭に書きます。関数の中やurlpatternsの後ろに書くと意図通り動きません。 | 他のimport文と並べて、ファイルの一番上にまとめて記述します。 |
| Djangoバージョンでimport元が違う Django 2.0以降は django.urls、1.x系はdjango.conf.urlsです。古いサンプルをそのまま貼ると別のエラーになることがあります。 | 自分のバージョンをpython -m django --versionで確認し、上の対応表に合わせます。現行プロジェクトならdjango.urlsです。 |
urlpatterns の綴りミスurlpattern(s 抜け)やurl_patternsなどにすると、URLが一切認識されません。 | 変数名は必ずurlpatterns(複数形・アンダースコア無し)にします。 |
include の綴り・大文字小文字Includeやinculdeなど、importした名前と呼び出し名がずれていると同じエラーが出ます。 | すべて小文字のincludeで統一します。 |
よくある質問(FAQ)
Q. 'path' is not defined や 're_path' is not defined も出ました。
A. 原因はまったく同じで、その関数をimportしていないためです。from django.urls import include, path, re_path のように、使う関数をすべてimportに含めれば解決します。
Q. アプリ側のurls.pyにもincludeのimportは必要ですか?
A. アプリ側でinclude()を使っていなければ不要です。includeは基本的に「他のurls.pyを取り込む側」で使う関数なので、末端のアプリではpathのimportだけで十分です。
Q. from django.conf.urls import include と書いたら別の警告やエラーが出ました。
A. それはDjango 1.x系向けの古い書き方です。Django 2.0以降ではdjango.conf.urlsからのimportは非推奨・廃止されている部分があり、url関数も削除されています。現行バージョンではfrom django.urls import include, path を使ってください。
Q. importを追加したのにまだエラーが消えません。
A. 編集しているurls.pyのファイルが正しいか(プロジェクト側かアプリ側か)、保存できているか、開発サーバーを再起動したかを確認してください。複数のurls.pyがある場合、別のファイルでもinclude()を使っていて、そちらにimport漏れが残っていることがあります。
子ページはありません
- Invalid HTTP_HOST header: '...'. You may need to add '...' to ALLOWED_HOSTS
- CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
- django.utils.datastructures.MultiValueDictKeyError
- Forbidden (403) CSRF verification failed. Request aborted.
- ModuleNotFoundError: No module named 'MySQLdb'
- WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection
- Unknown column 'table_name.id' in 'field list'
- RuntimeError: Model class ~ doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
- get() returned more than one MynumberRegist -- it returned 2!
- django.db.utils.OperationalError: (2006, "Can't connect to MySQL server")
- 'include' is not defined
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Djangoテンプレートのif・elif・else|型・未定義と複合条件 2026-10-25 23:02:54
- DjangoのSQLite接続設定|DATABASES・dbshellとCLIエラーの確認 2026-10-25 22:56:56
- Django REST FrameworkでAPIを作る|URL接続・入力検証・所有者の認可 2026-10-25 21:03:21
- DjangoモデルをJSONで返す|型・公開フィールド・DRF認可 2026-10-25 20:46:35
- precompile standard library とは(Pythonインストール) 2026-10-25 20:30:17
- ANACONDA NAVIGATORの起動方法 2026-10-25 20:30:17
- DjangoのAjax POST|CSRF・JSON入力検証・DRFの認可 2026-10-25 20:30:16
- Django/MySQLのUnknown column ...id|主キー・実列・別名の確認 2026-10-25 20:08:53
- 【django】limit, offsetの指定方法 2026-10-25 20:08:51
- Djangoの本番で変更が反映されないとき|プロセス・テンプレート・静的配信の確認 2026-10-25 19:40:35
- Django のファイルアップロード|ファイル名と拡張子の取得 2026-10-25 19:40:35
- djangoにおけるHTTPステータスコードの返し方 2026-10-25 19:40:34
- PythonのResponseオブジェクトの中身の確認 2026-10-25 19:17:54
- Python で Cookie を扱う|requests の Session と http.cookies 2026-10-25 19:17:54
- Python で HTTP リクエスト|requests・urllib・httpx と curl の対応 2026-10-25 19:17:53