Django: фреймворк для создания веб-приложений на Python за минуты
Для кого эта статья:
- Начинающие разработчики, интересующиеся веб-разработкой на Python
- Студенты и участники курсов по программированию, желающие овладеть Django
Специалисты, стремящиеся повысить свои навыки и создать портфолио проектов
Вы когда-нибудь задумывались, как быстро создать полноценное веб-приложение на Python? Django — именно тот инструмент, который позволит вам перейти от написания простых скриптов к разработке мощных веб-систем за минимальное время. Этот фреймворк, созданный перфекционистами для перфекционистов, избавляет от большинства рутинных задач веб-разработки и позволяет сосредоточиться на уникальной логике вашего приложения. Готовы превратить свои знания Python в реальные веб-проекты? 🚀
Хотите за 9 месяцев стать профессиональным Python-разработчиком? Курс Python-разработки от Skypro включает углубленное изучение Django и других востребованных технологий. Вы создадите собственное портфолио из 15+ проектов, а команда карьерных консультантов поможет найти работу с зарплатой от 90 000 рублей. Никакой скучной теории — только практика под руководством экспертов из IT-компаний!
Django для новичков: что это и почему стоит изучать
Django — это высокоуровневый веб-фреймворк на Python, созданный для разработчиков, которые ценят своё время. Представьте, что вы строите дом: вместо того, чтобы самостоятельно изготавливать кирпичи, Django предоставляет готовые строительные блоки и чертежи. Вам остаётся только решить, какой дом вы хотите построить. 🏗️
Фреймворк следует принципу "батарейки включены", что означает наличие всего необходимого для создания веб-приложений прямо "из коробки":
- Встроенная административная панель
- Система аутентификации пользователей
- ORM (Object-Relational Mapping) для работы с базами данных
- Мощная система маршрутизации URL
- Шаблонизатор для генерации HTML
- Защита от распространённых уязвимостей
Александр Петров, Senior Backend Developer
Когда я только начинал изучать веб-разработку, я потратил месяцы на создание собственных функций для валидации форм, обработки URL и работы с базой данных. Переход на Django стал для меня настоящим откровением. Первое, что меня поразило — административная панель, которая генерируется автоматически. Помню свой шок, когда после всего 20 минут настройки я получил полнофункциональный интерфейс для управления данными. То, что раньше занимало недели, теперь требовало считанных часов. Мой первый коммерческий проект на Django — онлайн-платформа для образовательных курсов — был запущен всего за три недели, включая тестирование и деплой.
Почему стоит выбрать именно Django для изучения веб-разработки на Python? Давайте сравним его с другими популярными вариантами:
| Фреймворк | Скорость разработки | Масштабируемость | Экосистема | Порог вхождения |
|---|---|---|---|---|
| Django | Высокая | Отличная | Обширная | Средний |
| Flask | Средняя | Хорошая | Умеренная | Низкий |
| FastAPI | Высокая | Отличная | Растущая | Средний |
| Pyramid | Средняя | Отличная | Ограниченная | Высокий |
Django используют такие крупные проекты как Spotify, Dropbox, Instagram, Pinterest и The Washington Post. Это свидетельствует о его надёжности и масштабируемости. Для начинающих разработчиков особенно ценны качественная документация и активное сообщество, готовое помочь с решением любых проблем.

Настройка Django: как установить и создать первый проект
Перед установкой Django убедитесь, что на вашем компьютере установлен Python (желательно версии 3.8 или выше) и пакетный менеджер pip. Давайте приступим к настройке рабочего окружения. 🛠️
Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта. Вот пошаговая инструкция для установки:
- Создайте виртуальное окружение:
python -m venv django_env
- Активируйте виртуальное окружение:
- Windows:
django_env\Scripts\activate
- macOS/Linux:
source django_env/bin/activate
- Установите Django:
pip install django
- Проверьте установку:
python -m django --version
После успешной установки можно создать первый проект. Django предоставляет удобную утилиту командной строки для этого:
django-admin startproject myproject
Эта команда создаст каталог с базовой структурой проекта. Давайте разберёмся, что означает каждый файл:
| Файл/Директория | Назначение |
|---|---|
| manage.py | Утилита командной строки для управления проектом |
| myproject/ | Пакет Python для вашего проекта |
| myproject/init.py | Пустой файл, указывающий Python, что этот каталог является пакетом |
| myproject/settings.py | Настройки и конфигурация проекта |
| myproject/urls.py | Декларации URL для проекта (таблица маршрутизации) |
| myproject/asgi.py | Точка входа для ASGI-совместимых веб-серверов |
| myproject/wsgi.py | Точка входа для WSGI-совместимых веб-серверов |
Django организован по принципу "проект содержит приложения". Проект — это веб-сайт целиком, а приложения — функциональные модули сайта (например, блог, форум, магазин). Создадим наше первое приложение:
cd myproject
python manage.py startapp myapp
Теперь нужно зарегистрировать приложение в проекте. Откройте файл myproject/settings.py и добавьте 'myapp' в список INSTALLED_APPS:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
После этих настроек можно запустить встроенный сервер разработки и убедиться, что всё работает:
python manage.py runserver
Если вы увидите сообщение о том, что сервер запущен (обычно на http://127.0.0.1:8000/), значит, всё настроено правильно! 🎉
Основы архитектуры Django: MTV и как программировать на Python
Django основан на архитектурном паттерне MTV (Model-Template-View), который является адаптацией более известного паттерна MVC (Model-View-Controller). Понимание этой архитектуры — ключ к эффективному использованию Django. 🧩
Давайте рассмотрим, как соотносятся компоненты MTV с традиционным MVC:
- Model (Модель) — компонент, ответственный за данные и их структуру, аналогичен модели в MVC
- Template (Шаблон) — отвечает за представление данных пользователю, аналогичен представлению (View) в MVC
- View (Представление) — обрабатывает запросы и связывает модели с шаблонами, аналогичен контроллеру (Controller) в MVC
Когда пользователь делает запрос к Django-приложению, происходит следующая последовательность действий:
- URL-диспетчер определяет, какое представление должно обработать запрос
- Представление запрашивает нужные данные из модели
- Модель получает данные из базы данных
- Представление передаёт данные в шаблон
- Шаблон рендерит HTML, который отправляется пользователю
Теперь давайте создадим простое представление, чтобы понять, как программировать на Python в контексте Django. Откройте файл myapp/views.py и добавьте следующий код:
from django.http import HttpResponse
def hello_world(request):
return HttpResponse("Привет, Django! Мое первое веб-приложение на Python!")
Чтобы это представление стало доступным, нужно создать файл urls.py в каталоге вашего приложения (myapp/):
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world, name='hello_world'),
]
Затем нужно включить URL-конфигурацию приложения в общую конфигурацию проекта. Откройте myproject/urls.py и внесите изменения:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
Теперь, если вы запустите сервер и перейдёте по адресу http://127.0.0.1:8000/hello/, то увидите сообщение "Привет, Django! Мое первое веб-приложение на Python!".
Мария Соколова, Python-преподаватель
Один из моих учеников долго не мог понять, как работает архитектура Django. Всё изменилось, когда мы перешли от теории к практике. Мы работали над простым приложением для кулинарных рецептов, и я попросила его представить модель как картотеку рецептов, представления как библиотекарей, а шаблоны как страницы книги рецептов. Когда пользователь запрашивает рецепт блинов, URL-маршрутизатор направляет запрос нужному "библиотекарю" (представлению). Библиотекарь находит карточку рецепта (модель) и вставляет информацию в красиво оформленную страницу книги (шаблон), которую передаёт пользователю. После этой аналогии все кусочки пазла встали на свои места, и ученик не только быстро освоил Django, но и стал одним из самых активных участников нашего курса.
Django также предоставляет более мощные инструменты для создания представлений. Например, класс-представления (Class-Based Views), которые позволяют использовать преимущества объектно-ориентированного программирования:
from django.views.generic import TemplateView
class HelloWorldView(TemplateView):
template_name = "hello.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['message'] = "Привет, Django! Мое первое веб-приложение на Python!"
return context
А для работы с шаблонами нужно создать файл hello.html в каталоге templates вашего приложения:
<!DOCTYPE html>
<html>
<head>
<title>Приветствие</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
Не забудьте создать каталог templates/myapp/ внутри вашего приложения и обновить настройки в urls.py, чтобы использовать новое класс-представление.
Создаём базу данных: модели и миграции в Django
Одна из самых мощных функций Django — это его ORM (Object-Relational Mapping), который позволяет работать с базой данных через Python-объекты вместо написания SQL-запросов. Модели Django определяют структуру данных и автоматически создают соответствующие таблицы в базе данных. 📊
Давайте создадим простую модель для блога. Откройте файл myapp/models.py и добавьте следующий код:
from django.db import models
from django.utils import timezone
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
Здесь мы определили модель BlogPost с тремя полями: title (заголовок), content (содержание) и publisheddate (дата публикации). Метод _str__ определяет, как объект будет отображаться в административной панели и консоли.
После определения модели нужно создать и применить миграции. Миграции — это способ Django для отслеживания изменений в моделях и обновления схемы базы данных:
python manage.py makemigrations myapp
python manage.py migrate
Первая команда создаёт файлы миграций на основе изменений в ваших моделях, а вторая применяет эти миграции к базе данных.
Django поддерживает различные типы полей для моделей. Вот самые распространённые из них:
| Тип поля | Описание | Пример использования |
|---|---|---|
| CharField | Строка ограниченной длины | Имя пользователя, заголовок |
| TextField | Текст неограниченной длины | Содержание статьи, комментарий |
| IntegerField | Целое число | Возраст, количество просмотров |
| DateTimeField | Дата и время | Дата публикации, дата регистрации |
| BooleanField | Логическое значение | Статус активности, флаг подписки |
| ForeignKey | Связь "многие-к-одному" | Автор статьи, категория товара |
| ManyToManyField | Связь "многие-ко-многим" | Теги статей, участники проекта |
Давайте расширим наш пример, добавив модели для категорий и комментариев:
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Categories"
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')
def __str__(self):
return self.title
class Comment(models.Model):
post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments')
author_name = models.CharField(max_length=100)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"Comment by {self.author_name} on {self.post.title}"
В этом примере мы добавили:
- Связь "многие-к-одному" между BlogPost и Category (один пост может принадлежать только одной категории, но в категории может быть много постов)
- Связь "многие-к-одному" между Comment и BlogPost (один пост может иметь много комментариев)
- Параметр on_delete=models.CASCADE указывает, что при удалении категории или поста все связанные объекты также будут удалены
- Параметр related_name задаёт имя для обратной связи (например, category.posts позволяет получить все посты в категории)
После определения этих моделей не забудьте создать и применить миграции:
python manage.py makemigrations myapp
python manage.py migrate
Теперь вы можете создавать и запрашивать объекты через Django ORM:
from myapp.models import Category, BlogPost, Comment
# Создание категории
tech = Category.objects.create(name="Technology", description="All about tech")
# Создание поста
post = BlogPost.objects.create(
title="Введение в Django",
content="Django — это потрясающий фреймворк для веб-разработки на Python.",
category=tech
)
# Создание комментария
comment = Comment.objects.create(
post=post,
author_name="John Doe",
text="Отличная статья, спасибо!"
)
# Получение всех постов в категории
tech_posts = tech.posts.all()
# Получение всех комментариев к посту
post_comments = post.comments.all()
Django ORM предоставляет мощный API для фильтрации и сортировки данных, что позволяет выполнять сложные запросы без написания SQL.
От кода к сайту: как запустить своё первое Django-приложение
После настройки моделей пора сделать наш проект действительно функциональным, создав представления для отображения данных и интерфейс для взаимодействия с пользователями. Разберёмся, как превратить наш код в полноценный веб-сайт. 🌐
Начнём с создания представлений для нашего блога. Откройте файл myapp/views.py и добавьте следующие представления:
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from .models import BlogPost, Category
class BlogListView(ListView):
model = BlogPost
template_name = 'myapp/blog_list.html'
context_object_name = 'posts'
ordering = ['-published_date']
class BlogDetailView(DetailView):
model = BlogPost
template_name = 'myapp/blog_detail.html'
context_object_name = 'post'
def category_posts(request, category_id):
category = get_object_or_404(Category, id=category_id)
posts = category.posts.all().order_by('-published_date')
return render(request, 'myapp/category_posts.html', {'category': category, 'posts': posts})
Теперь настроим URL-маршруты для этих представлений. Откройте или создайте файл myapp/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.BlogListView.as_view(), name='blog_list'),
path('post/<int:pk>/', views.BlogDetailView.as_view(), name='blog_detail'),
path('category/<int:category_id>/', views.category_posts, name='category_posts'),
]
Для работы наших представлений нам понадобятся шаблоны. Создайте следующие файлы в каталоге templates/myapp/:
- base.html — базовый шаблон для всех страниц:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой блог на Django{% endblock %}</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
color: #333;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
header {
background-color: #4CAF50;
color: white;
padding: 10px 0;
text-align: center;
}
nav {
background-color: #f8f9fa;
padding: 10px 0;
}
nav ul {
list-style-type: none;
padding: 0;
display: flex;
justify-content: center;
}
nav ul li {
margin: 0 15px;
}
nav a {
text-decoration: none;
color: #333;
}
.post {
margin-bottom: 30px;
border-bottom: 1px solid #eee;
padding-bottom: 20px;
}
footer {
text-align: center;
margin-top: 30px;
padding: 20px 0;
background-color: #f8f9fa;
}
</style>
</head>
<body>
<header>
<div class="container">
<h1>Мой блог на Django</h1>
</div>
</header>
<nav>
<div class="container">
<ul>
<li><a href="{% url 'blog_list' %}">Главная</a></li>
{% for cat in categories %}
<li><a href="{% url 'category_posts' cat.id %}">{{ cat.name }}</a></li>
{% endfor %}
</ul>
</div>
</nav>
<div class="container">
{% block content %}
{% endblock %}
</div>
<footer>
<div class="container">
<p>© 2023 Мой блог на Django</p>
</div>
</footer>
</body>
</html>
- blog_list.html — список всех постов:
{% extends 'myapp/base.html' %}
{% block title %}Все посты | Мой блог на Django{% endblock %}
{% block content %}
<h2>Последние посты</h2>
{% for post in posts %}
<div class="post">
<h3><a href="{% url 'blog_detail' post.id %}">{{ post.title }}</a></h3>
<p>{{ post.content|truncatewords:30 }}</p>
<p><small>Категория: <a href="{% url 'category_posts' post.category.id %}">{{ post.category.name }}</a> |
Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>
</div>
{% empty %}
<p>На данный момент нет доступных постов.</p>
{% endfor %}
{% endblock %}
- blog_detail.html — детальная страница поста:
{% extends 'myapp/base.html' %}
{% block title %}{{ post.title }} | Мой блог на Django{% endblock %}
{% block content %}
<div class="post-detail">
<h2>{{ post.title }}</h2>
<p><small>Категория: <a href="{% url 'category_posts' post.category.id %}">{{ post.category.name }}</a> |
Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>
<div class="post-content">
{{ post.content|linebreaks }}
</div>
<h3>Комментарии ({{ post.comments.count }})</h3>
{% for comment in post.comments.all %}
<div class="comment">
<p><strong>{{ comment.author_name }}</strong> <small>{{ comment.created_date|date:"d.m.Y H:i" }}</small></p>
<p>{{ comment.text|linebreaks }}</p>
</div>
{% empty %}
<p>Нет комментариев. Будьте первым!</p>
{% endfor %}
</div>
{% endblock %}
- category_posts.html — посты определённой категории:
{% extends 'myapp/base.html' %}
{% block title %}{{ category.name }} | Мой блог на Django{% endblock %}
{% block content %}
<h2>Посты в категории: {{ category.name }}</h2>
{% if category.description %}
<p>{{ category.description }}</p>
{% endif %}
{% for post in posts %}
<div class="post">
<h3><a href="{% url 'blog_detail' post.id %}">{{ post.title }}</a></h3>
<p>{{ post.content|truncatewords:30 }}</p>
<p><small>Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>
</div>
{% empty %}
<p>В этой категории ещё нет постов.</p>
{% endfor %}
{% endblock %}
Чтобы отобразить категории в навигационном меню, нам нужно добавить их в контекст всех шаблонов. Для этого создайте файл myapp/context_processors.py:
from .models import Category
def categories_processor(request):
return {
'categories': Category.objects.all()
}
И добавьте этот процессор контекста в настройки проекта (myproject/settings.py):
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myapp.context_processors.categories_processor', # Добавьте эту строку
],
},
},
]
Осталось настроить административную панель для удобного управления контентом. Откройте myapp/admin.py и добавьте следующий код:
from django.contrib import admin
from .models import Category, BlogPost, Comment
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'description')
search_fields = ('name',)
@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'published_date')
list_filter = ('category', 'published_date')
search_fields = ('title', 'content')
date_hierarchy = 'published_date'
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ('author_name', 'post', 'created_date')
list_filter = ('created_date',)
search_fields = ('author_name', 'text', 'post__title')
Теперь создайте суперпользователя для доступа к административной панели:
python manage.py createsuperuser
Запустите сервер разработки и перейдите по адресу http://127.0.0.1:8000/admin/, чтобы добавить несколько категорий и постов. После этого посетите http://127.0.0.1:8000/, чтобы увидеть ваш блог в действии!
Освоение Django открывает перед вами бескрайние горизонты веб-разработки на Python. Начав с понимания базовых концепций — моделей, представлений и шаблонов — вы получаете мощный инструментарий для создания практически любых веб-приложений. Пусть ваш первый проект будет простым, но каждая новая функция, добавленная вами самостоятельно, станет кирпичиком в фундаменте вашего профессионального роста. Не бойтесь экспериментировать и задавать вопросы сообществу — путь к мастерству в Django лежит через практику и любопытство.
Читайте также
- Python: история языка от эксперимента до лидера программирования
- Объектно-ориентированное программирование на Python: принципы и практики
- Популярные библиотеки Python: ключевые инструменты разработчика
- Flask: микрофреймворк для создания веб-приложений на Python
- 15 лучших сообществ Python: где получить помощь по коду
- Модули и пакеты Python: структурирование кода для разработчиков
- Как установить Python на Windows, macOS и Linux: пошаговая инструкция
- Python: лучший язык программирования для начинающих разработчиков
- 10 лучших книг по Python: от новичка до профессионала
- Python в IT: перспективы карьеры, зарплаты и ключевые навыки


