Введение
Django — один из самых популярных фреймворков для веб-разработки на Python. По данным опроса JetBrains Python Developers Survey 2025, Django используют около 20% Python-разработчиков, и это второй по популярности веб-фреймворк после Flask. Однако даже опытные разработчики тратят до 30% времени на написание шаблонного кода: модели, сериализаторы, представления, настройки админки. Чтобы ускорить этот процесс, я подготовил подборку из 15 готовых промтов (продвинутых запросов для AI-ассистентов), которые помогут сгенерировать код быстрее, избежать типовых ошибок и следовать лучшим практикам Django. Каждый промт — это конкретная инструкция, которую можно скопировать и вставить в ChatGPT, Claude или другой AI-инструмент. Примеры кода основаны на реальных проектах и официальной документации Django (docs.djangoproject.com/en/stable/).
1. Промт для генерации модели с полями, мета-опциями и валидацией
Для чего: Быстрое создание модели с типами полей, параметрами Meta (ordering, verbose_name) и кастомной валидацией через clean().
Промт:
Создай модель Django для [название сущности, например, Product] с полями: name (CharField, max_length=200), price (DecimalField, max_digits=10, decimal_places=2), created_at (DateTimeField, auto_now_add=True). Добавь Meta-класс с ordering = ['-created_at'] и verbose_name = 'Товар'. Реализуй метод clean(), который проверяет, что price > 0. Также добавь метод __str__, возвращающий name. Используй from django.db import models и from django.core.exceptions import ValidationError.
Пример использования:
from django.db import models
from django.core.exceptions import ValidationError
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-created_at']
verbose_name = 'Товар'
def __str__(self):
return self.name
def clean(self):
if self.price <= 0:
raise ValidationError({'price': 'Цена должна быть положительной.'})
2. Промт для создания модели с внешним ключом и related_name
Для чего: Генерация связанных моделей (ForeignKey) с правильным related_name и опцией on_delete.
Промт:
Создай модель Order с полями: user (ForeignKey на модель User из django.contrib.auth.models, on_delete=models.CASCADE, related_name='orders'), total (DecimalField), status (CharField с choices=[('pending', 'В ожидании'), ('paid', 'Оплачен')], default='pending'). Добавь Meta с ordering = ['-id'] и __str__, возвращающий f'Order {self.id}'.
Пример:
from django.db import models
from django.contrib.auth.models import User
class Order(models.Model):
STATUS_CHOICES = [
('pending', 'В ожидании'),
('paid', 'Оплачен'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
total = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
class Meta:
ordering = ['-id']
def __str__(self):
return f'Order {self.id}'
3. Промт для написания Class-Based View (ListView и DetailView)
Для чего: Быстрое создание представлений на основе классов с настройкой queryset, template_name и контекста.
Промт:
Создай ListView для модели Product, который выводит список товаров, отсортированных по цене (по возрастанию). Используй template_name = 'shop/product_list.html'. Добавь пагинацию по 10 элементов на страницу. Также создай DetailView для Product с template_name = 'shop/product_detail.html'. В обоих случаях передавай в контекст дополнительную переменную 'site_name' со значением 'Мой магазин'.
Пример кода:
from django.views.generic import ListView, DetailView
from .models import Product
class ProductListView(ListView):
model = Product
template_name = 'shop/product_list.html'
context_object_name = 'products'
paginate_by = 10
queryset = Product.objects.all().order_by('price')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['site_name'] = 'Мой магазин'
return context
class ProductDetailView(DetailView):
model = Product
template_name = 'shop/product_detail.html'
context_object_name = 'product'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['site_name'] = 'Мой магазин'
return context
4. Промт для создания FormView с обработкой формы
Для чего: Создание представления для кастомной формы (например, обратной связи).
Промт:
Создай FormView для формы ContactForm (с полями name, email, message). Укажи template_name = 'contact/contact.html' и success_url = '/thanks/'. Переопредели метод form_valid, чтобы сохранять данные в модель ContactMessage (модель создай с полями name, email, message, created_at). После сохранения отправляй письмо на адрес admin@example.com через django.core.mail.send_mail.
Пример:
from django.views.generic.edit import FormView
from django.core.mail import send_mail
from .forms import ContactForm
from .models import ContactMessage
class ContactFormView(FormView):
template_name = 'contact/contact.html'
form_class = ContactForm
success_url = '/thanks/'
def form_valid(self, form):
data = form.cleaned_data
ContactMessage.objects.create(
name=data['name'],
email=data['email'],
message=data['message']
)
send_mail(
subject=f'Сообщение от {data["name"]}',
message=data['message'],
from_email=data['email'],
recipient_list=['admin@example.com'],
)
return super().form_valid(form)
5. Промт для создания REST API эндпоинта (DRF ModelViewSet)
Для чего: Быстрая генерация ViewSet и сериализатора для REST API с использованием Django REST Framework.
Промт:
Создай ModelViewSet для модели Product. Создай сериализатор ProductSerializer с полями: id, name, price, created_at. Включи валидацию: price не может быть отрицательным. Добавь permission_classes = [IsAuthenticatedOrReadOnly] (только чтение для анонимов, запись для авторизованных). Используй from rest_framework import viewsets, serializers, permissions.
Пример:
from rest_framework import viewsets, serializers, permissions
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['id', 'name', 'price', 'created_at']
def validate_price(self, value):
if value < 0:
raise serializers.ValidationError('Цена не может быть отрицательной.')
return value
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
6. Промт для настройки админки Django
Для чего: Быстрая конфигурация ModelAdmin с list_display, list_filter, search_fields и actions.
Промт:
Создай ModelAdmin для модели Product. Отобрази в списке поля: name, price, created_at. Добавь фильтрацию по created_at и статусу (если есть). Включи поиск по name. Создай action 'make_discount' который уменьшает цену выбранных товаров на 10%. Зарегистрируй модель в админке.
Пример:
from django.contrib import admin
from .models import Product
from django.http import HttpResponseRedirect
def make_discount(modeladmin, request, queryset):
for product in queryset:
product.price *= 0.9
product.save()
modeladmin.message_user(request, 'Цена снижена на 10%.')
make_discount.short_description = 'Снизить цену на 10%'
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'created_at']
list_filter = ['created_at']
search_fields = ['name']
actions = [make_discount]
admin.site.register(Product, ProductAdmin)
7. Промт для создания кастомного менеджера модели
Для чего: Создание QuerySet-менеджера с часто используемыми фильтрами.
Промт:
Создай кастомный менеджер ProductManager, который наследуется от models.Manager. Добавь метод available(), возвращающий товары с price > 0 и status='active'. Также добавь метод cheap(threshold=100), фильтрующий товары дешевле заданной цены. Укажи менеджер в модели Product как objects = ProductManager().
Пример:
from django.db import models
class ProductManager(models.Manager):
def available(self):
return self.filter(price__gt=0, status='active')
def cheap(self, threshold=100):
return self.filter(price__lt=threshold)
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, default='active')
objects = ProductManager()
8. Промт для создания сигнала (post_save)
Для чего: Автоматические действия при сохранении модели (например, логирование).
Промт:
Создай сигнал post_save для модели Order. При создании нового заказа (created=True) создавай запись в модели OrderLog с полями: order (ForeignKey), action='created', timestamp. Используй @receiver(post_save, sender=Order). Не забудь импортировать from django.db.models.signals import post_save и from django.dispatch import receiver.
Пример:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Order, OrderLog
@receiver(post_save, sender=Order)
def create_order_log(sender, instance, created, **kwargs):
if created:
OrderLog.objects.create(
order=instance,
action='created'
)
9. Промт для создания middleware
Для чего: Обработка запросов до передачи в view (например, измерение времени выполнения).
Промт:
Создай middleware под названием ExecutionTimeMiddleware. В методе __call__ замеряй время до и после обработки запроса (используя time.time). Если время выполнения превышает 1 секунду, записывай warning в лог через import logging. Возвращай response. Добавь middleware в MIDDLEWARE в settings.py.
Пример:
import time
import logging
logger = logging.getLogger(__name__)
class ExecutionTimeMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start = time.time()
response = self.get_response(request)
end = time.time()
duration = end - start
if duration > 1:
logger.warning(f'Slow request: {request.path} took {duration:.2f}s')
return response
10. Промт для создания кастомного тега шаблона
Для чего: Вывод данных в шаблонах без дублирования кода.
Промт:
Создай inclusion_tag под названием 'recent_products', который выводит последние 5 товаров. Тег должен принимать аргумент count (по умолчанию 5). Шаблон для тега — 'shop/recent_products.html' (выводит список <ul> с ссылками на товары). Зарегистрируй тег через register.inclusion_tag в файле templatetags/shop_tags.py.
Пример:
# templatetags/shop_tags.py
from django import template
from ..models import Product
register = template.Library()
@register.inclusion_tag('shop/recent_products.html')
def recent_products(count=5):
products = Product.objects.all().order_by('-created_at')[:count]
return {'products': products}
11. Промт для создания API с фильтрацией и пагинацией (DRF)
Для чего: Генерация API с поддержкой фильтрации по параметрам запроса и пагинацией.
Промт:
Создай ListAPIView для модели Product. Добавь фильтрацию по полю category (передаётся как ?category=...). Используй PageNumberPagination с размером страницы 20. Если параметр category не указан, возвращай все товары. Используй from rest_framework.generics import ListAPIView и from rest_framework.pagination import PageNumberPagination.
Пример:
from rest_framework.generics import ListAPIView
from rest_framework.pagination import PageNumberPagination
from .models import Product
from .serializers import ProductSerializer
class ProductListAPIView(ListAPIView):
serializer_class = ProductSerializer
pagination_class = PageNumberPagination
pagination_class.page_size = 20
def get_queryset(self):
queryset = Product.objects.all()
category = self.request.query_params.get('category')
if category:
queryset = queryset.filter(category=category)
return queryset
12. Промт для создания кастомной команды управления (management command)
Для чего: Автоматизация задач через manage.py (например, очистка старых записей).
Промт:
Создай management command с именем 'cleanup_orders'. Команда удаляет все заказы старше 30 дней со статусом 'pending'. Используй аргумент --days для задания количества дней (по умолчанию 30). Выводи количество удалённых заказов. Команда должна быть в файле management/commands/cleanup_orders.py.
Пример:
# management/commands/cleanup_orders.py
from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from ...models import Order
class Command(BaseCommand):
help = 'Удаляет старые заказы'
def add_arguments(self, parser):
parser.add_argument('--days', type=int, default=30)
def handle(self, *args, **options):
days = options['days']
threshold = timezone.now() - timedelta(days=days)
deleted, _ = Order.objects.filter(
created_at__lt=threshold,
status='pending'
).delete()
self.stdout.write(f'Удалено {deleted} заказов.')
13. Промт для настройки CORS в Django REST Framework
Для чего: Разрешение кросс-доменных запросов к API.
Промт:
Напиши инструкцию по настройке CORS для Django REST Framework. Укажи, что нужно установить django-cors-headers, добавить 'corsheaders' в INSTALLED_APPS, 'corsheaders.middleware.CorsMiddleware' в MIDDLEWARE (в начало). Установи CORS_ALLOWED_ORIGINS = ['http://localhost:3000'] для разработки. Для продакшена используй CORS_ALLOWED_ORIGINS с доменами фронтенда.
Пример:
# settings.py
INSTALLED_APPS = [
...
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ALLOWED_ORIGINS = [
'http://localhost:3000',
'https://example.com',
]
14. Промт для создания тестов (pytest-django)
Для чего: Генерация тестов для моделей и API.
Промт:
Создай тесты с использованием pytest-django для модели Product. Напиши тест test_product_creation, который создаёт Product с name='Test', price=100 и проверяет, что объект сохранён. Напиши тест test_product_price_positive, проверяющий валидацию (price не должен быть отрицательным). Используй @pytest.mark.django_db.
Пример:
import pytest
from .models import Product
@pytest.mark.django_db
def test_product_creation():
product = Product.objects.create(name='Test', price=100)
assert product.name == 'Test'
assert product.price == 100
@pytest.mark.django_db
def test_product_price_positive():
with pytest.raises(Exception):
Product.objects.create(name='Test', price=-10)
15. Промт для оптимизации QuerySet (select_related и prefetch_related)
Для чего: Уменьшение количества запросов к БД.
Промт:
Напиши пример использования select_related и prefetch_related для модели Order. Order имеет ForeignKey на User и ManyToManyField на Product через промежуточную модель. Покажи, как получить все заказы с пользователями и товарами за 2 запроса. Используй Order.objects.select_related('user').prefetch_related('products').all().
Пример:
# Запрос с оптимизацией
orders = Order.objects.select_related('user').prefetch_related('products').all()
for order in orders:
print(order.user.email) # не вызывает доп. запрос
for product in order.products.all(): # не вызывает доп. запрос
print(product.name)
Заключение
Эти 15 промтов покрывают 90% повседневных задач Django-разработчика: от создания моделей до настройки API и тестирования. Используйте их как шпаргалку, адаптируя под свои проекты. Помните: AI-инструменты ускоряют написание кода, но не заменяют понимания архитектуры Django. Всегда проверяйте сгенерированный код на соответствие требованиям вашего проекта. Если вы хотите углубить знания Django, рекомендую официальную документацию (docs.djangoproject.com) и туториалы от Two Scoops of Django. Начните с внедрения хотя бы 2-3 промтов в свой рабочий процесс — и вы заметите, как сократится время на рутину.
Комментарии