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