A Basic Django MVT application example is here.
1. Technologies & Prerequisites
-
- Python 3.7, 3.8
- Django 3.1
- HTML 5
2. MVT Architecture
The Model-View-Template (MVT) Architecture is a software design pattern for developing web applications.
- The Model is an interface for maintaining and managing data in the database in proper tables.
- The View interface executes the logic and interacts with the models.
- The Templates help to render the information received as a response from the views based on the request on the browser for user interaction.
To know more about the MVT Architecture check this article.
3. Django MVT Basic Application Example
3.1 Virtualenv
The first step of beginning any python project is creating a virtual environment. Follow this tutorial to set up and activate a virtualenv
and then install Django.
virtualenv env
source env/bin/activate
pip install Django
3.2 Setup Django Project
Start a Django project (here, project name:django_mvt
) and create an app named home
. Check this tutorial for more details.
django-admin startproject django_mvt
cd django_mvt/
python manage.py startapp home
Add the name of the newly created app home
to the INSTALLED_APPS
list in settings.py
.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'home',
]
3.3 Design Model
A Model is basically a design for the database. Here, we will create a model for a simple database of books. This is specified in the models.py
file in the newly created directory of the home
app.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=250)
author = models.CharField(max_length=250)
def __str__(self):
return self.title
3.4 Migrations
Django uses the sqlite3
database by default as specified in the settings. This can be changed as per requirements. Refer to Database Documentation for more details.
Now, run this command
python manage.py makemigrations home
You should get a similar output
The makemigrations
command tells Django that some changes have been made to the specified model and to store the changes as a migration. A migration
is how Django stores changes in the models and thus the database schema. Also, file is created home/migrations/0001_initial.py
, where you can check the stored changes. You are not required to read this every time as it is just a reference to the changes that will be made, although you can edit them in case you want the manually make some changes.
You can try running this command to see the SQL query required to create the changes specified by the migrations to the database mentioned in the project settings.
python manage.py sqlmigrate home 0001
Also, one is not supposed to run this command every time. It is just to see SQL command for the migration file.
3.5 Migrate
Next, run the migrate
command to actually make changes in the database ie. apply the migrations.
python manage.py migrate
The migrate command creates any necessary database tables for all the apps listed in the INSTALLED_APPS setting as per the database settings mentioned in the settings.py
file. This all the unapplied migrations and synchronizes the changes in the database.
4. Entering Data
4.1 Django Shell
Django provides a free API using which one can use the interactive python shell and explore the Database API.
Invoke the python shell using this command:
python manage.py shell
Once inside the shell, we can read the data and enter/edit data as well.
# import the model class
>>> from home.models import Book
>>> Book.objects.all()
<QuerySet []>
# create a new book
>>> b = Book(title="Atomic Habits", author="James Clear")
# save the object in the database
>>> b.save()
# the book is now available in the database
>>> Book.objects.all()
<QuerySet [<Book: Atomic Habits>]>
# it has an id and similarly we can access it other fields
>>> b.id
1
>>> b.title
'Atomic Habits'
>>> b.author
'James Clear'
# exit the shell using this command or use Ctrl+Z
>>> exit()
4.2 Django Admin
Django has its own inbuilt admin interface that helps the site managers, staff, clients to manage the data on the website. This is not intended to be used by the site visitors.
First, create a user who can log in to the admin site using this command. Then enter the desired username
, email
and password
. For testing purposes, one can use a dummy mail too.
python manage.py createsuperuser
Now, start the development server using the command.
python manage.py runserver
Then, navigate to the local domain of the django admin site on a web browser, ie. http://localhost:8000/admin/
and you should see the admin’s login screen.
Enter the username
and password
entered while creating the superuser and then you should see the Django admin index page.
But, we cannot see our Book data here.
For that, we need to register our Book objects with the admin interface. Edit the home/admin.py
file as follows.
from django.contrib import admin
from .models import Book
admin.site.register(Book)
On saving the file, the server with reload automatically and now we can see our Book data in the admin interface.
You can click on the Book section and add new data using the admin panel.
5. View Data
5.1 Create Template
Next, create an HTML template to view the data as a site visitor. Create appropriate folders and add this to home/templates/home/index.html
.
Refer to this article to know more about Django templates and this documentation for the syntax.
<!DOCTYPE html>
<head>
<title>Book Database</title>
</head>
<body>
<h2>Book Database</h2>
{% if books_list %}
<ul>
{% for book in books_list %}
<li> <b> {{book.title}} </b> | {{book.author}} </li>
{% endfor %}
</ul>
{% else %}
<p>No books entered in the database. </p>
{% endif %}
</body>
</html>
5.3 Views and URLs
Next, create a view in home/views.py
to show the data in the database to the user.
from django.shortcuts import render
from .models import Book
def index(request):
books_list = Book.objects.all()
context = {'books_list': books_list}
return render(request, 'home/index.html', context=context)
Here, we fetch all the objects and pass them to the context. The context is a dictionary mapping template variable names to Python objects.
Create a file home/urls.py
with the following content.
from . import views
from django.urls import path
urlpatterns = [
path('', views.index),
]
Next, create a URL pattern for this app in the URL patterns for our project, ie. in the file django_mvt/urls.py
.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('home.urls')),
path('admin/', admin.site.urls),
]
Now start the server using python manage.py runserver
and we can see our data as per the format specified in the template.
6. References
Download Source from GIT:
Happy Learning 🙂