Форма обратной связи Django 1.4(2): CreateView и ModelForm

категория: Django
Про форму обратной связи я уже писал, но она была сделана без отправки сообщения на почту и без использования Class-based generic views. Подробно все описывать не буду, кто что-то не понял - спрашивайте. Буду использовать ModelForm, иногда полезно в базу все письма сохранять, потом в админке читать, а то на почте вечно куча хлама. Приступим к моделям:
#! coding: utf-8
from django.db import models
from django.forms import ModelForm, Textarea
from captcha.fields import CaptchaField
#
#
class Contact(models.Model):
    title = models.CharField('Тема:', max_length=100)
    name = models.CharField('Имя:', max_length=100)
    mail = models.EmailField('Электронный адрес:', max_length=100)
    text = models.TextField('Сообщение:')
#
    class Meta:
        verbose_name = 'Сообщение'
        verbose_name_plural = 'Сообщения'
#
    def __unicode__(self):
        return '%s' % self.title
#
#
class ContactForm(ModelForm):
    captcha = CaptchaField(label='Проверочный код:')
#
    class Meta:
        model = Contact
        widgets = {
            'text': Textarea(attrs={
		'cols': 80, 'rows': 10})
        }
Поле captcha - это при использовании пакета django-simple-captcha. Небольшая защита от спама. Мне пока ее хватало, но можете ее не использовать. В urls.py добавляем:
...
from contact.views import ContactCreateView
...
url(r'^contact/$', ContactCreateView.as_view(), name='contacts'),
...
Ну и сама реализация через CreateView:
from django.conf import settings
from django.views.generic import CreateView
from django.core.mail import send_mail
#
from contact.models import Contact, ContactForm
#
#
class ContactCreateView(CreateView):
    form_class = ContactForm
    template_name = 'contacts.html'
    success_url = '/thanks/'
#
    def form_valid(self, form):
        message = '{name} / {mail} написал: '.format(
            name=form.cleaned_data.get('name').encode('utf-8'),
            mail=form.cleaned_data.get('mail').encode('utf-8')
        )
        message += "\n\n{0}".format(form.cleaned_data.get('text').encode('utf-8'))
        send_mail(
            subject=form.cleaned_data.get('title').encode('utf-8').strip(),
            message=message,
            from_email='contact-form@myapp.com',
            recipient_list=settings.LIST_OF_EMAIL_RECIPIENTS
        )
        return super(ContactCreateView, self).form_valid(form)
LIST_OF_EMAIL_RECIPIENTS - это список получателей сообщений, находится в settings.py, а также нужны настройки почтового сервера. Я использовал гугловский, параметры такие:
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'ваша почта'
EMAIL_HOST_PASSWORD ='пароль'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
А также нужно еще ссылку на страницу переадресации при успешном отправлении формы "success_url":
url(r'^thanks/$', TemplateView.as_view(template_name='success_contact.html')),
Ну и шаблончик 'success_contact.html', что-то типа: "спасибо за сообщение, заходите в гости". Теперь сам шаблон для нашей формы:
{% extends 'main.html' %}
{% block title %}
    Написать письмо автору
{% endblock %}
{% block keywords %}
    Обратная связь, написать письмо, автору
{% endblock %}
{% block description %}
    Написать письмо автору книги
{% endblock %}
{% block form %}
    <form method="POST" action="">
        {% csrf_token %}
        <div class="form">
            {{ form }}
        </div>
        <input type="submit" value="Отправить сообщение">
    </form>
{% endblock %}
Все это красиво украсить и осталось только письма читать. В админку, думаю, уже знаете как регистрировать. В следующей статье опишу как реализовал гостевую книгу для cryptohistory.ru.


blog comments powered by Disqus