Создание веб-приложений с помощью фреймворка Django
Основы фреймворка Django
Django – это высокоуровневый веб-фреймворк на Python, который позволяет быстро создавать безопасные и поддерживаемые веб-приложения. Он следует архитектуре MTV (Model-Template-View) и включает множество встроенных компонентов: ORM, аутентификацию, административный интерфейс, маршрутизацию и другие. Основное преимущество – автоматизация рутинных задач, что ускоряет разработку. Ниже рассмотрен процесс создания простейшего проекта.
Установка фреймворка выполняется через pip:
pip install djangoсоздание сайтов python django (создание веб-сайтов на django с использованием python)
После установки создается проект командой django-admin startproject:
django-admin startproject mysitePython web django (web-фреймворк django)
Внутри проекта создается приложение:
python manage.py startapp myappPython web flask (web-фреймворк flask)
Необходимо добавить приложение в список INSTALLED_APPS в файле settings.py:
INSTALLED_APPS = [
...
'myapp',
]Python web server (web-сервер на python)
Создадим простой view в файле myapp/views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse('Привет, мир!')Python 3 веб приложение (веб-приложение на python 3)
Настроим URL в myapp/urls.py (создать файл) и подключим его в корневом urls.py:
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
# mysite/urls.py
from django.urls import include, path
urlpatterns = [
path('', include('myapp.urls')),
]Python веб сервисы (веб-сервисы на python)
Запускаем сервер разработки:
python manage.py runserverпримеры python веб (примеры веб-разработки на python)
При переходе по адресу http://127.0.0.1:8000/ браузер отобразит строку 'Привет, мир!'.
- ImportError: No module named 'myapp' – приложение не добавлено в INSTALLED_APPS.
- ModuleNotFoundError: No module named 'myapp.urls' – не создан файл urls.py в приложении или не подключен include.
- TemplateDoesNotExist (возникает при использовании render) – проверьте пути к шаблонам.
Как отобразить динамическую страницу с данными с помощью шаблонов?
Для отображения динамического содержимого используются шаблоны. Django использует собственный язык шаблонов. Необходимо создать папку templates в приложении или проекте и настроить TEMPLATES в settings.py. Пример настройки DIRS:
TEMPLATES = [
{
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
...
},
]создание сайта на python (создание сайта на python)
Создаем шаблон templates/index.html:
<h2>Привет, {{ name }}!</h2>Django python создание приложения (создание веб-приложения на django)
Используем функцию render в view:
from django.shortcuts import render
def index(request):
context = {'name': 'Иван'}
return render(request, 'index.html', context)библиотека django python (библиотека django для веб-разработки на python)
Результат: на странице отобразится 'Привет, Иван!'.
- TemplateDoesNotExist: index.html – проверьте, что файл находится в правильной папке, указанной в DIRS или в каталоге шаблонов приложения (если APP_DIRS=True).
- KeyError: 'name' – если переменная не передана в контекст.
Как работать с данными через ORM Django?
Django ORM позволяет описывать структуру данных с помощью классов-моделей и выполнять запросы к базе данных без написания SQL. Пример модели Product:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
def __str__(self):
return self.namePython django практика (практика django на python)
После создания модели выполняются миграции:
python manage.py makemigrations
python manage.py migrateИспользование в view:
from .models import Product
def product_list(request):
products = Product.objects.all()
return render(request, 'products.html', {'products': products})В шаблоне можно вывести данные:
<ul>
{% for product in products %}
<li>{{ product.name }} – {{ product.price }}</li>
{% endfor %}
</ul>- django.db.utils.OperationalError: no such table – не выполнены миграции (migrate).
- TypeError: Model.__init__() got an unexpected keyword argument – несоответствие полей в модели и переданных аргументов.
- Конфликты миграций при работе в команде – рекомендуется использовать python manage.py makemigrations --merge.
Как создать REST API для внешних клиентов с помощью Django REST Framework?
Django REST Framework (DRF) – популярная библиотека для создания RESTful API. Установка:
pip install djangorestframeworkДобавление в INSTALLED_APPS:
INSTALLED_APPS = [
...
'rest_framework',
]Создание сериализатора для модели Product:
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'ViewSet для обработки запросов:
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializerПодключение маршрутов через DefaultRouter:
from rest_framework.routers import DefaultRouter
from .views import ProductViewSet
router = DefaultRouter()
router.register(r'products', ProductViewSet)
urlpatterns = router.urlsТеперь по адресу /api/products/ доступен CRUD для модели Product.
- 404 Not Found – не подключены маршруты роутера, проверьте urlpatterns.
- SerializationError: Object is not JSON serializable – если в модели есть поля, не поддерживаемые по умолчанию (например, ImageField), требуется кастомная сериализация.
- PermissionDenied – отсутствуют права доступа, настройте permission_classes.
Как управлять данными через встроенный административный интерфейс Django?
Django поставляется с готовой админ-панелью. Для управления моделью её необходимо зарегистрировать в файле admin.py приложения. Пример настройки для Product:
from django.contrib import admin
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'price')
search_fields = ('name',)Создается суперпользователь:
python manage.py createsuperuserЗатем админка доступна по адресу /admin/. В ней можно просматривать, добавлять, редактировать и удалять объекты модели.
- Model not registered – забыли добавить модель в admin.py.
- AttributeError: 'Product' object has no attribute 'price' – если поле не существует или опечатка в list_display.
- Permission denied – пользователь не имеет прав персонала (is_staff) или суперпользователя.
Расширенные примеры использования Django
Для демонстрации более сложного сценария создадим приложение для управления статьями с использованием Class-Based Views (CBV) и ModelForm. Это позволит увидеть, как Django автоматизирует обработку форм и списков.
Модель Article с полями заголовка, содержимого и даты публикации:
# models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.titleФорма на основе модели:
# forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']Представления: список статей (ListView) и создание новой статьи (CreateView):
# views.py
from django.views.generic import ListView, CreateView
from django.urls import reverse_lazy
from .models import Article
from .forms import ArticleForm
class ArticleListView(ListView):
model = Article
template_name = 'articles/article_list.html'
context_object_name = 'articles'
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'articles/article_form.html'
success_url = reverse_lazy('article-list')Маршруты:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.ArticleListView.as_view(), name='article-list'),
path('create/', views.ArticleCreateView.as_view(), name='article-create'),
]Шаблоны. Список статей (templates/articles/article_list.html):
<h2>Статьи</h2>
<ul>
{% for article in articles %}
<li>{{ article.title }} ({{ article.pub_date|date:'d.m.Y' }})</li>
{% empty %}
<li>Пока нет статей.</li>
{% endfor %}
</ul>
<a href='{% url 'article-create' %}'>Добавить статью</a>Форма создания статьи (templates/articles/article_form.html):
<h2>Новая статья</h2>
<form method='post'>
{% csrf_token %}
{{ form.as_p }}
<button type='submit'>Сохранить</button>
</form>
<a href='{% url 'article-list' %}'>Назад к списку</a>Результат работы приложения: при переходе по адресу /articles/ отображается список статей, а по адресу /articles/create/ – форма для добавления новой статьи. После отправки формы происходит перенаправление на список.
Вывод (пример страницы списка): Статьи - Первая статья (01.04.2025) - Вторая статья (02.04.2025) [Добавить статью]
Дополнительно можно рассмотреть использование сигналов. Например, автоматическое создание профиля пользователя при регистрации. Для этого в файле signals.py приложения пишется обработчик:
# signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()Затем в конфигурации приложения (apps.py) сигналы подключаются:
# apps.py
from django.apps import AppConfig
class MyappConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'myapp'
def ready(self):
import myapp.signalsТакой подход гарантирует, что при каждом создании пользователя автоматически создается связанная запись профиля.