Фреймворк Django: возможности и применение
Основные концепции Django и базовые настройки
Django - это высокоуровневый веб-фреймворк на Python, позволяющий быстро создавать безопасные и поддерживаемые веб-приложения. Основное преимущество - включение ORM, автоматической админки, системы маршрутизации и шаблонов. Чтобы начать, необходимо установить Django:
pip install djangoHtml css js python (интеграция python с html, css, javascript)
. Далее создать проект:django-admin startproject mysiteсоздание сайтов python django (создание веб-сайтов на django с использованием python)
. Внутри проекта создать приложение:cd mysite && python manage.py startapp myapp
Python web django (web-фреймворк django)
. После этого нужно зарегистрировать приложение в settings.py, добавив 'myapp' в INSTALLED_APPS. Затем определить модель в 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
Python web flask (web-фреймворк flask)
Выполнить миграции:
python manage.py makemigrations && python manage.py migratePython web server (web-сервер на python)
. Зарегистрировать модель в админке (admin.py):
from django.contrib import admin
from .models import Article
admin.site.register(Article)
Python 3 веб приложение (веб-приложение на python 3)
Создать суперпользователя:
python manage.py createsuperuserPython веб сервисы (веб-сервисы на python)
. Запустить сервер:python manage.py runserverпримеры python веб (примеры веб-разработки на python)
и войти в админку по адресу http://127.0.0.1:8000/admin/. Для вывода статей на сайте создаются представление (views.py):
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'myapp/article_list.html', {'articles': articles})
создание сайта на python (создание сайта на python)
Настраивается URL в urls.py приложения:
from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
]
Django python создание приложения (создание веб-приложения на django)
Подключаются маршруты приложения в главном urls.py:
from django.urls import include, path
urlpatterns = [
path('myapp/', include('myapp.urls')),
]
библиотека django python (библиотека django для веб-разработки на python)
Создается шаблон templates/myapp/article_list.html. Например:
<ul>
{% for article in articles %}
<li>{{ article.title }} - {{ article.pub_date }}</li>
{% endfor %}
</ul>
Python django практика (практика django на python)
Это базовый набор действий для создания приложения на Django. В процессе возникают типичные проблемы.
Ошибка: ModuleNotFoundError: No module named 'django'
Причина: Django не установлен или используется виртуальное окружение. Решение: установить через pip или активировать окружение.
Ошибка: таблицы не создаются после makemigrations
Причина: приложение не зарегистрировано в INSTALLED_APPS или не выполнена команда migrate. Решение: проверить наличие приложения в settings.py и выполнить migrate.
Ошибка: 404 при обращении к странице
Причина: не подключены маршруты приложения или неправильное имя URL. Решение: проверить include в главном urls.py и имя path.
Как быстро создать представление для отображения списка объектов?
Для этой задачи используется Class Based View ListView. Это сокращает код, исключая ручное получение queryset и передачу в контекст. Пример:
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'myapp/article_list.html'
context_object_name = 'articles'
Python index html (работа с index.html в python)
Тогда в urls.py нужно указать имя класса:
path('', ArticleListView.as_view(), name='article_list'). Данный вариант удобен, когда представление только выводит данные без дополнительной логики.
Проблема: неверное имя шаблона по умолчанию
ListView ожидает шаблон myapp/articlemodel_list.html (по имени модели в нижнем регистре). Если шаблон называется иначе, нужно явно указать template_name, иначе Django вернет ошибку TemplateDoesNotExist.
Как обработать отправку формы и сохранить данные в модель?
Для обработки формы используется Class Based View CreateView с формой на основе модели (ModelForm). Пример модели Article, форма:
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
Представление:
from django.views.generic.edit import CreateView
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(CreateView):
model = Article
form_class = ArticleForm
template_name = 'myapp/article_form.html'
success_url = '/myapp/'
Шаблон article_form.html:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сохранить</button>
</form>
Такой подход автоматически обрабатывает валидацию, сохранение и перенаправление. Однако требуется настройка CSRF.
Проблема: ошибка CSRF при POST запросе
Если в форме отсутствует тег {% csrf_token %}, Django вернет ошибку 403 Forbidden. Решение: всегда включать csrf_token в формы, созданные внутри приложения. Для API запросов можно использовать декоратор @csrf_exempt, но это не рекомендуется для обычных форм.
Как организовать маршруты с параметрами в URL?
Для передачи идентификатора объекта в URL используется конвертер <int:pk> или <slug:slug>. Пример DetailView:
from django.views.generic import DetailView
class ArticleDetailView(DetailView):
model = Article
template_name = 'myapp/article_detail.html'
context_object_name = 'article'
URL:
path('<int:pk>/', ArticleDetailView.as_view(), name='article_detail')
В шаблоне article_detail.html получаем объект article. Это позволяет создавать динамические страницы.
Проблема: конфликт маршрутов
Несколько маршрутов с параметрами могут пересекаться. Например, <int:pk>/ и article/create/. Решение: сначала регистрировать статические маршруты, затем динамические. Или использовать пространства имен.
Расширенные примеры использования Django
Первый пример: модель с внешним ключом на категорию и кастомный менеджер для фильтрации.
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='articles')
pub_date = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
published = ArticleManager() # кастомный менеджер
def __str__(self):
return self.title
class ArticleManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(pub_date__lte=timezone.now())
Использование в представлении: Article.published.all(). Результат - только опубликованные статьи.
Второй пример: создание кастомного шаблонного тега для вывода количества статей в категории.
# myapp/templatetags/custom_tags.py
from django import template
from ..models import Category
register = template.Library()
@register.simple_tag
def article_count(category_id):
try:
category = Category.objects.get(pk=category_id)
return category.articles.count()
except Category.DoesNotExist:
return 0
В шаблоне: {% load custom_tags %} {% article_count category.id %}. Результат: количество статей.
Третий пример: middleware для логирования времени обработки запроса.
# myapp/middleware.py
import time
from django.utils.deprecation import MiddlewareMixin
class TimingMiddleware(MiddlewareMixin):
def process_request(self, request):
request.start_time = time.time()
def process_response(self, request, response):
duration = time.time() - request.start_time
print(f"Request to {request.path} took {duration:.3f} seconds")
return response
Добавляется в MIDDLEWARE в settings.py: 'myapp.middleware.TimingMiddleware'. Результат: в консоль выводится время обработки.
Четвертый пример: использование Signal для автоматического создания профиля пользователя при регистрации.
# myapp/signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from .models import Profile
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
post_save.connect(create_profile, sender=User)
В apps.py: изменить ready метод для импорта signals.
Каждый пример сопровождается результатом: в первом случае при обращении к опубликованным статьям выводятся только те, у которых pub_date меньше текущего времени; во втором - число статей; в третьем - логи в консоли; в четвертом - автоматическое создание профиля.