DEV Community

Malicha Galma
Malicha Galma

Posted on

Django Architecture:Models, Views and Templates

A beginner-friendly explanation of Django’s core design pattern
Django is a high-level Python framework that helps developers build secure and maintainable websites quickly. One of the most important concepts that powers Django is the MVT architecture, which stands for:
Model– represents the data structure

View– contains the logic

Template– handles presentation

Although it's inspired by the MVC (Model-View-Controller) pattern, Django takes a slightly different approach by introducing Templates instead of Controllers. That said, Django doesn’t force you to stick to a particular architecture — you can organize your app the way that works best for you.

Models .
In Django, a model defines the structure of your database tables. Each model is a Python class that inherits from models.Model, and each attribute maps to a database field.

python
class Users(models.Model):
full_name = models.CharField(max_length=200)
bio = models.TextField()
def __str__(self):
return self.full_name
The above example will generate a Users table with full_name and bio as its columns.

Models contain all the necessary fields and behavior for your data. They're the layer that handles all your database interactions — from creation to querying.

Learn more: https://docs.djangoproject.com/en/5.2/topics/db/models/

Views .
A view is where your logic lives. It’s a function or class that processes a request and returns a response. It may fetch data from the model and pass it to the template, or return a redirect or even JSON.

python
Copy
Edit
def users_list(request):
users = Users.objects.all()
return render(request, 'users/users_list.html', {'users': users})
The above function gets all Users from the database and passes them to a template named users_list.html. Views are usually stored in a file called views.py inside your app.

Learn more: https://docs.djangoproject.com/en/5.2/topics/http/views/

Templates
Templates are HTML files that allow you to display dynamic content using Django’s templating language. They include special syntax to loop over data, show variables, or include conditional statements.

<!DOCTYPE html>
<html>
<head>
    <title>My Users</title>
</head>
<body>
    <h1>All Users</h1>
    {% for user in users %}
        <div>
            <h2>{{ user.full_name }}</h2>
            <p>{{ user.bio }}</p>
        </div>
    {% empty %}
        <p>No users available.</p>
    {% endfor %}
</body>
</html>

Enter fullscreen mode Exit fullscreen mode

In this example, the template loops through the list of users and renders each one. If the list is empty, it shows a fallback message.

URL configuration.
To make your view accessible via a browser, you need to connect it to a URL pattern.

python
from django.urls import path
from . import views
urlpatterns = [
path('', views.users_list, name='users_list'),
]
This connects the root URL (/) of your app to the users_list view.

How MVT works.
Here’s a quick rundown of how Django’s MVT pattern flows:

A request comes from the browser

urls.pysends the request to the right view

The view fetches data from the model

The data is passed to a template

The template renders a response as HTML

Finally
Django’s MVT architecture breaks your app into three key parts:

Model:Manages the structure and interaction with the database

View:Handles business logic and request processing

Template:Takes care of rendering the UI

This separation makes your code cleaner, easier to manage, and scalable as your project grows.

Want to take this further? I’d be happy to write a follow-up on Django Forms

Top comments (0)