If you create a Django app using the startapp command, youβll notice that the app folder created does not include the urls.py
file. This does not mean that we have put all the routes of our Django website in the urls.py
of our project folder. If we had to do that, our project will be messy and hard to manage and scale. The best solution to that is to create the urls.py
manually for each app in our project, then include that file in the projectβs urls.py
file. This post will show you how to include URLs to main URLs in Django.
This post assumes that youβve already created a Django project. We will start by creating the app, then weβll create the urls.py
file for the app, then weβll include the file in the main URLs of our Django project. If you have an app already, you can start at the second section where we register the app.
Django Include URLs: Table of Contents
Steps to follow to include app URLs to project URLs in Django:
- Create A Django App.
- Register the App to
Settings.py
- Create A
urls.py
file for the app - Link the
urls.py
in the projectβs urls.py - Add URL patterns to the Appβs
urls.py
Letβs do this step by step.
1. Create A Django App.
You can create a Django app using the startapp command. Type the following code in the terminal of your project. Make sure the virtual environment is activated if youβre using one.
(env) $ python manage.py startapp blog
In this case, blog
is the name of the app. It can be any name, just make sure it resonates with what the app is about. The structure of a newly created app looks like this:
[project_name]
βββ config
β βββ __init__.py
β βββ settings.py
β βββ urls.py
β βββ wsgi.py
βββ blog # new app
| βββ migrations
β βββ _init_.py
β βββ admin.py
β βββ apps.py
β βββ models.py
| βββ views.py
| βββ tests.py
βββ manage.py
As you can see, there is no urls.py
file like there is in the config
folder (the project folder). Therefore, we have to create it manually. But before we do so, we have to register the new app to Djangoβs settings.py
so that its URLs can be recognized as part of the project.
2. Register the App to Settings.py
In the settings.py
file of your project folder, in the INSTALLED_APPS
list, add the string name of your app.
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# My apps
'blog' #new
]
3. Create A urls.py
file for the app
Next, create the urls.py file in the app folder.
...
βββ app_name # new app
β βββ _init_.py
β βββ admin.py
β βββ apps.py
β βββ models.py
| βββ views.py
| βββ urls.py # new file
| βββ tests.py
...
The name of the file can be anything for sure, but itβs a best practice to call it urls.py
because of its role in the Django app. Now that the file is there, we have to link it to the projectβs URLs.
4. Include the urls.py
in the projectβs urls.py
from django.contrib import admin
from django.urls import path, include #new
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')) #new
]
We first import the include() function which according to Django is βA function that takes a full Python import path to another URLconf module that should be βincludedβ in this place.β
Next, we add a URL pattern and pass in a route, and the include()
function. The route is an empty string to indicate the home page, meaning all other routes that are imported to this pattern are going to start from the home page.
We could have done it like this:
...
path('blog/', include('blog.urls')) #new
...
This means that all URL routes from the blog app are going to start with the blog/
part then followed by anything you specify in the app urls.py
itself.
Next, we pass in the include()
function as the second argument and we pass to it the URLs of our app in the form 'app.urls'
. It has to be a string.
If you forget how to include app URLs to project URLs, Django has added some helpful comments right above the code in the urls.py
file of your project. You can always check them for reference.
"""config URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
...
In this case, the part youβre looking for is under the Including another URLconf section.
5. Add URL patterns to the Appβs urls.py
Finally, letβs test our Django application and see if we have linked the URLs correctly to each other. In the urls.py
of your app, add the following code:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name = 'home')
]
In the views.py
of the app folder, add the following code.
from django.shortcuts import render
from django.http import HttpResponse #new
def index(request): #new
return HttpResponse('<h1>Django Include URLs</h1>')
This is a simple view that returns an HTML heading which says Django Include URLs. If you run the Django server and navigate to 127.0.0.1:8000. You should see something like this:

Conclusion
Okay, that was all for this Django include URLs tutorial. If you have any questions, feel free to let me know in the comments section below.