Summary: in this tutorial, you’ll learn how to create a new application in a Django project, how to define views, and map the views with URLs.
This tutorial begins where the Getting Started with Django tutorial left off.
Django projects and applications
In the Django framework:
- A project is a Django installation with some settings.
- An application is a group of models, views, templates, and URLs.
A Django project may have one or more applications. For example, a project is like a website that may consist of several applications such as blogs, users, and wikis.
Typically, you design a Django application that can be reusable in other Django projects. The following picture shows the structure of a Django project and its applications:
Creating a blog application
To create an application, you use the startapp
command as follows:
python manage.py startapp app_name
Code language: CSS (css)
For example, you can create an application called blog
using the startapp
command like this:
python manage.py startapp blog
Code language: CSS (css)
The command creates a blog
directory with some files:
├── blog
| ├── admin.py
| ├── apps.py
| ├── migrations
| ├── models.py
| ├── tests.py
| ├── views.py
| └── __init__.py
├── db.sqlite3
├── django_project
| ├── asgi.py
| ├── settings.py
| ├── urls.py
| ├── wsgi.py
| ├── __init__.py
| └── __pycache__
└── manage.py
Code language: plaintext (plaintext)
Registering an application
After creating an application, you need to register it to the project especially when the application uses templates and interacts with a database.
The blog
app has the apps.py
module which contains the BlogConfig
class like this:
from django.apps import AppConfig
class BlogConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'blog'
Code language: Python (python)
To register the blog
app, you add the blog.apps.BlogConfig
class to the INSTALLED_APPS
list in the settings.py
of the project:
INSTALLED_APPS = [
# ...
'blog.apps.BlogConfig',
]
Code language: Python (python)
Alternatively, you can use the app name like blog
in the INSTALLED_APPS
list like this:
INSTALLED_APPS = [
# ...
'blog',
]
Code language: Python (python)
Creating a view
The views.py
file in the blog
directory comes with the following default code:
from django.shortcuts import render
# Create your views here.
Code language: Python (python)
The views.py will contain all the views of the application. A view is a function that takes an HttpRequest
object and returns an HttpResponse
object. It’s equivalent to the controller in the MVC architecture.
To create a new view, you import the HttpResponse
from the django.http
into the views.py
file and define a new function that accepts an instance of the HttpRequest
class:
from django.shortcuts import render
from django.http import HttpResponse
def home(request):
return HttpResponse('<h1>Blog Home</h1>')
Code language: Python (python)
In this example, the home()
function returns a new HttpResponse
object that contains a piece of HTML code. The HTML code includes an h1
tag.
The home()
function accepts an instance of an HttpRequest
object and returns an HttpResponse
object. It is called a function-based view. Later, you’ll learn how to create class-based views.
To map a URL with the home()
function, you create a new file urls.py
inside the blog
directory and add the following code to the urls.py
file:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='posts'),
]
Code language: Python (python)
How it works.
First, import the path
from django.urls
module:
from django.urls import path
Code language: Python (python)
Second, import the views.py
module from the current directory.
from . import views
Code language: Python (python)
Note that this is a relative import that imports the views
module from the current directory.
Third, define a route that maps the blog URL with the home()
function using the path()
function.
urlpatterns = [
path('', views.home, name='posts'),
]
Code language: Python (python)
The name
keyword argument defines the name of the route. Later, you can reference the URL using the route name instead of the hard-code URL like blog/
.
By using the name for the path, you can change the URL of the path to something else like my-blog/
in the urls.py
instead of changing the hard-coded URL everywhere.
Note that the final argument of the path must be a keyword argument like name='posts'
. If you use a positional argument like this:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, 'posts'), # Error
]
Code language: Python (python)
you’ll get the following error:
TypeError: kwargs argument must be a dict, but got str.
Code language: plaintext (plaintext)
To make the blog’s routes work, you need to include the urls.py
of the blog
application in the urls.py
file of the Django project:
from django.contrib import admin
from django.urls import path, include # new
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # new
]
Code language: Python (python)
In the urls.py
of the project, we import the include
function from the django.urls
and map the path of the blog to the blog.urls
.
By doing this, when you navigate to http://127.0.0.1:8000/blog/
, Django will run the home()
function of the views.py
module and returns a webpage that displays a h1
tag.
Before opening the URL, you need to start the Django development web server:
python manage.py runserver
Code language: Python (python)
When you navigate to http://127.0.0.1:8000/blog/
, you’ll see a webpage that displays the Blog Home
heading.
Here’s the flow:
- First, the web browser sends an HTTP request to the URL
http://127.0.0.1:8000/blog/
- Second, Django executes the
urls.py
in thedjango_project
directory. It matches theblog/
with the URL in theurlpatterns
list in theurls.py
. As a result, it sends''
to theurls.py
of theblog
app. - Third, Django runs the
urls.py
file in theblog
application. It matches the''
URL with theviews.home
function and execute it, which returns an HTTP response that outputs ah1
tag. - Finally, Django returns a webpage to the web browser.
Adding more routes
First, define the about()
function in the views.py
of the blog
application:
from django.shortcuts import render
from django.http import HttpResponse
def home(request):
return HttpResponse('<h1>Blog Home</h1>')
def about(request):
return HttpResponse('<h1>About</h1>')
Code language: Python (python)
Second, add a route to the urls.py
file:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='posts'),
path('about/', views.about, name='about'),
]
Code language: Python (python)
Third, open the URL http://127.0.0.1:8000/blog/about/
, and you’ll see a page that displays the About page.
Now, if you open the home URL, you’ll see a page that displays a page not found with a 404 HTTP status code.
The reason is that the urls.py
in the django_project
doesn’t have any route that maps the home URL with a view.
To make the blog application the homepage, you can change the route from blog/
to ''
as follows:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
Code language: Python (python)
If you open the URL http://127.0.0.1:8000
, you’ll see the blog home page. And navigating to the URL http://127.0.0.1:8000/about/
will take you to the About page.
Download the Django Project source code
Summary
- A Django project contains one or more applications.
- A Django application is a group of models, views, templates, and URLs.
- Use
python manage.py startapp app_name
command to create a new Django application. - Define a function in the
views.py
file to create a function-based view. - Define a route in the
urls.py
file of the application to map a URL pattern with a view function. - Use the
include()
function to include theurls.py
of app in theurls.py
of the project.