11.

Django「include is not defined」エラーの原因と解決|urls.pyのimport追加

編集
この記事の要点
  • 原因は1つだけurls.pyの中でinclude()関数を、import(読み込み)せずに使っているためです。
  • 解決はファイル先頭に from django.urls import include, path を追加するだけです。
  • Django 2.0以降は django.urls から、Django 1.x系の古いコードは django.conf.urls から include を読み込みます。import元の違いに注意してください。
  • 同様のエラーで 'path' is not defined / 're_path' is not defined が出る場合も、原因と対処はまったく同じです。

 

エラーの意味

Djangoのurls.pyでURLパターンを書く際に、include()という関数を呼び出しています。しかし、そのincludeという名前がどこからも読み込まれていない(定義されていない)ため、Pythonが「そんな名前は知らない」と判断して次のエラーを出します。

NameError: name 'include' is not defined

 

つまりこれは、include()を使う前に その関数をimport(読み込み)し忘れている という、典型的なimport漏れのエラーです。Django固有の難しい不具合ではなく、Pythonの基本的なルール(使う名前は事前に定義・import しておく)に沿った素直なエラーです。

 

原因

下のように、urls.pyinclude()を呼んでいるのに、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.urlsdjango.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, pathpath / re_path
Django 1.x 系(旧)from django.conf.urls import include, urlurl(正規表現ベース)

 

自分の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 の綴り・大文字小文字
Includeinculdeなど、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漏れが残っていることがあります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Invalid HTTP_HOST header: '...'. You may need to add '...' to ALLOWED_HOSTS
  2. CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.
  3. django.utils.datastructures.MultiValueDictKeyError
  4. Forbidden (403) CSRF verification failed. Request aborted.
  5. ModuleNotFoundError: No module named 'MySQLdb'
  6. WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection
  7. Unknown column 'table_name.id' in 'field list'
  8. RuntimeError: Model class ~ doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
  9. get() returned more than one MynumberRegist -- it returned 2!
  10. django.db.utils.OperationalError: (2006, "Can't connect to MySQL server")
  11. 'include' is not defined

最近更新/作成されたページ