IT-журнал

Форма обратной связи на Django: от создания модели до отправки уведомлений

Узнайте, как реализовать форму обратной связи на Django с использованием Django Forms, моделей и встроенной системы отправки Email.

Обновлено 21.09.2026

⏱ 1 мин чтения · 👁 прочитали 4

Форма обратной связи — это базовый элемент любого современного веб-сайта. Она позволяет пользователям задавать вопросы, сообщать об ошибках или оставлять предложения, не покидая страницу. В Django реализация такого функционала занимает минимум времени благодаря встроенным инструментам работы с формами и моделями.

В этой статье мы разберем процесс создания формы «под ключ»: от проектирования базы данных до настройки отправки уведомлений на почту администратора.

Шаг 1: Проектирование модели данных

Хранить сообщения из форм обратной связи в базе данных — хорошая практика. Это гарантирует, что вы не потеряете данные, если почтовый сервер временно станет недоступен.

Создайте модель в models.py:

from django.db import models

class Feedback(models.Model):
    name = models.CharField(max_length=100, verbose_name="Имя")
    email = models.EmailField(verbose_name="Email")
    subject = models.CharField(max_length=200, verbose_name="Тема")
    message = models.TextField(verbose_name="Сообщение")
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Сообщение от {self.name} по теме {self.subject}"

    class Meta:
        verbose_name = "Обратная связь"
        verbose_name_plural = "Обратная связь"

Не забудьте выполнить команды python manage.py makemigrations и python manage.py migrate.

Шаг 2: Создание формы с помощью ModelForm

Django предоставляет класс ModelForm, который автоматически генерирует HTML-поля на основе модели. Это сокращает объем шаблонного кода.

Создайте файл forms.py:

from django import forms
from .models import Feedback

class FeedbackForm(forms.ModelForm):
    class Meta:
        model = Feedback
        fields = ['name', 'email', 'subject', 'message']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Ваше имя'}),
            'email': forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Ваш email'}),
            'subject': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Тема обращения'}),
            'message': forms.Textarea(attrs={'class': 'form-control', 'rows': 5}),
        }

Шаг 3: Реализация бизнес-логики в View

Теперь создадим представление, которое будет обрабатывать GET-запрос (показ формы) и POST-запрос (сохранение данных и отправка email).

В views.py:

from django.shortcuts import render, redirect
from django.core.mail import send_mail
from django.conf import settings
from .forms import FeedbackForm

def feedback_view(request):
    if request.method == 'POST':
        form = FeedbackForm(request.POST)
        if form.is_valid():
            # Сохраняем сообщение в БД
            feedback = form.save()

            # Отправляем уведомление администратору
            send_mail(
                subject=f"Новое сообщение: {feedback.subject}",
                message=f"От: {feedback.name} ({feedback.email})\n\n{feedback.message}",
                from_email=settings.DEFAULT_FROM_EMAIL,
                recipient_list=[settings.ADMIN_EMAIL],
                fail_silently=False,
            )
            return render(request, 'feedback/success.html')
    else:
        form = FeedbackForm()

    return render(request, 'feedback/feedback_form.html', {'form': form})

Шаг 4: Настройка отправки почты

Чтобы send_mail заработал, добавьте настройки SMTP-сервера в settings.py. Для примера используем Gmail:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-email@gmail.com'
EMAIL_HOST_PASSWORD = 'your-app-password' # Пароль приложения, а не основной пароль
DEFAULT_FROM_EMAIL = 'your-email@gmail.com'
ADMIN_EMAIL = 'admin@example.com'

Шаг 5: Создание шаблона

Создайте простой HTML-файл feedback_form.html. Используйте метод .as_p или переберите поля вручную для более гибкого дизайна.

<h2>Свяжитесь с нами</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">Отправить</button>
</form>

Итоги

Мы реализовали полноценный цикл работы с обратной связью:
1. Модель обеспечивает надежное хранение данных.
2. ModelForm автоматизирует валидацию и рендеринг полей.
3. View управляет процессом сохранения и уведомления.
4. SMTP-настройки позволяют оперативно узнавать о новых сообщениях.

Такой подход легко масштабировать: например, добавить капчу для защиты от спама или интегрировать API сторонних сервисов рассылок.