Django - Форма обратной связи

    blazer |   01.05.2016 |   17:15:55 |   Django |

Создание формы обратной связи на Django.

В этой статье поделюсь с вами рецептом, как написать простую форму обратной связи.

Делал тоже по примеру, но вносил свои дополнения и изменения.

Форма будет состоять из полей:

 

 

subject - Тема
sender - e-mail
message - сообщение
copy - копия на свой адрес почты

И так приступим.

1. Создаем модель формы в файле forms.py вашего приложения в моем случае это blog.

# Модель формы обратной связи
class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'size':'40','class': 'form-control'}))
    sender = forms.EmailField(widget=forms.TextInput(attrs={'size':'40','class': 'form-control'}))
    message = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control'}))
    copy = forms.BooleanField(required=False)

2. В файле views.py пишем функцию обработчик

# Функция формы обратной связи
def contactform(reguest):
    if reguest.method == 'POST':
        form = ContactForm(reguest.POST)
        # Если форма заполнена корректно, сохраняем все введённые пользователем значения
        if form.is_valid():
            subject = form.cleaned_data['subject']
            sender = form.cleaned_data['sender']
            message = form.cleaned_data['message']
            copy = form.cleaned_data['copy']

            recepients = ['myemail@gmail.com']
            # Если пользователь захотел получить копию себе, добавляем его в список получателей
            if copy:
                recepients.append(sender)
            try:
                send_mail(subject, message, 'myemail@gmail.com', recepients)
            except BadHeaderError: #Защита от уязвимости
                return HttpResponse('Invalid header found')
            # Переходим на другую страницу, если сообщение отправлено
            return HttpResponseRedirect('/blog/thanks/')

    else:
        form = ContactForm()
    # Выводим форму в шаблон
    return render(reguest, 'contact.html', {'form': form, 'username': auth.get_user(reguest).username})

3. Здесь же в файле views.py пишем функцию к странице 'thanks' в случае успешной отправки будет выводится эта страница.

def thanks(reguest):
    thanks = 'thanks'
    return render(reguest, 'thanks.html', {'thanks': thanks})

4. В файле urls.py пишем маршрутизацию к страницам thanks и  contact

    url(r'^contact/$', views.contactform, name='contact'),
    url(r'^thanks/$', views.thanks, name='thanks'),

5. Выводим форму в шаблон contact.html примерно так.

{% extends 'base.html' %}
{% load bootstrap3 %}

{% block title %} - Обратная связь{% endblock %}

{% block contactform %}
 <div class="panel panel-success">
  <div class="panel-heading">
    <h2 class="panel-title">Обратная связь</h2>
  </div>
  <div class="panel-body">
<div class="well well-lg">
    <h3></h3>
<form action="{% url 'blog:contact' %}" method="post">
    {% csrf_token %}
{#    {% bootstrap_form form %}#}
    {{ form.non_field_errors }}
	<div>
	  <label for="id_subject">Тема:</label>
	  {{ form.subject.errors }}
{#	  {{ form.subject }}#}
      <input class="form-control" id="id_subject" name="subject" placeholder="Тема">
	</div>
    &nbsp;
	<div>
	  <label for="id_sender">E-mail:</label>
	  {{ form.sender.errors }}
{#	  {{ form.sender }}#}
      <input class="form-control" id="id_sender" name="sender" placeholder="Ваш e-mail">
	</div>
    &nbsp;
	<div>
	  <label for="id_message">Сообщение:</label>
	  {{ form.message.errors }}
{#	  {{ form.message }}#}
      <textarea class="form-control" id="id_message" name="message" placeholder="Введите ваше сообщение"></textarea>
	</div>
    &nbsp;
	<div>
	  {{ form.copy.errors }}
	  <label for="id_copy">{{ form.copy }} Отправить копию себе </label>
	</div>
    <br>
	<input type="submit" class="btn btn-success" value="Отправить сообщение"/>
</form>
  </div>
</div>
</div>

{% endblock %}

6. Выводим сообщение об успешной отправке в шаблон thanks.html примерно так.

{% extends 'base.html' %}
{% load bootstrap3 %}

{% block contactform %}

 <div class="panel panel-success">
  <div class="panel-heading">
    <h2 class="panel-title"></h2>
  </div>
  <div class="panel-body">
<div class="well well-lg" align="center">
    <h3>Спасибо, Ваше сообщение отправлено!</h3>
    <div align="center"><a href="/"><button type="button" class="btn btn-info">Вернутся на главную</button></a></div>
  </div>
</div>
</div>
{% endblock %}

7. В файл настроек settings.py добавляем эти настройки для работы почтового срвера. В моем случае я настроил отправку почты через сервер mail.ru, вы можете через любой другой настроить.

# Настройки почтового сервера
EMAIL_HOST = 'smtp.mail.ru'
EMAIL_HOST_USER = 'mymail@mail.ru'
EMAIL_HOST_PASSWORD = 'mypassword'
EMAIL_PORT = 465
EMAIL_USE_SSL = True
DEFAULT_FROM_EMAIL = 'mymail@mail.ru'

Впринципе все. Перезагружаем веб сервер и пробуем тестировать форму на отправку сообщений. Если все сделали правильно то сообщение должно придти на указанный адрес в настройках.

Ваши комментарии

Комментарии могут оставлять только зарегистрированые пользователи!

Disqus - комментарии

blog comments powered by Disqus