Фреймворк Django: возможности и применение

Раздел: Веб-разработка -> Веб-разработка

Основные концепции Django и базовые настройки

Django - это высокоуровневый веб-фреймворк на Python, позволяющий быстро создавать безопасные и поддерживаемые веб-приложения. Основное преимущество - включение ORM, автоматической админки, системы маршрутизации и шаблонов. Чтобы начать, необходимо установить Django:

pip install django

Html 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 migrate

Python 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 createsuperuser

Python веб сервисы (веб-сервисы на 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 меньше текущего времени; во втором - число статей; в третьем - логи в консоли; в четвертом - автоматическое создание профиля.

Web-фреймворк Django - comments

En
Python web django (python)