Сайтты дамытуды жалғастыра отырып, мен Django сайтында байланыс пішінін қосу үшін код үлгісін бөліскім келеді. Әртүрлі пішіндегі мақалалар болды, мысалы, түсініктемелер қосу үшін, бірақ біз тұтастай алғанда бүкіл процесс туралы айтып отырғандықтан, біз бұл тақырыпты да айналып өтпейміз.
Оның үстіне Wordpress сайты үшін бұл мен үшін ауыр тақырып болды. Бәріне жалқаулық кінәлі шығар, өйткені менде байланыс формасын өз бетімше сызу үшін PHP тілін түсіну ешқашан болған емес (нәтижесінде басқа плагин тартылды).
Django сайтындағы әзірлеме деректердің әртүрлі нысандарымен жиі жұмыс істейтінін және сонымен бірге пошта қызметтерімен жұмыс істеуге арналған модуль бар екенін ескерсек, онда мұндай пішінді қосу қиын емес.
Settings.py, urls.py, home/urls.py параметрлерін орнату
Біз жасайтын бірінші нәрсе - конфигурация файлын орнату, өйткені ол байланыс пішініндегі мазмұны бар электрондық пошта жіберілетін пошта жәшігіне қосылу үшін деректерді көрсетуі керек.
EMAIL_HOST = 'smtp.example.com' # Сервер для отправки сообщений EMAIL_HOST_USER = 'info@example.com' # имя пользователя EMAIL_HOST_PASSWORD = 'password123' # пароль от ящика EMAIL_PORT = 2525 # порт для подключения EMAIL_USE_TLS = True # использование протокола шифрования DEFAULT_FROM_EMAIL = 'info@example.com' # email, с которого будет отправлено письмо
Сондай-ақ осы файлда сіз байланыс формасына жауап беретін қолданбаны көрсетуіңіз керек. Менің жағдайда, бұл беттерді сирек өзгертуге жауап беретін үй қолданбасы, мысалы, байланыс пішіні бар бет. Сондай-ақ [django-bootstrap3] сайтында қолданылатын модуль (https://evileg.com/en/post/6/)
INSTALLED_APPS = [ ... 'home.apps.HomeConfig', 'bootstrap3', ... ]
Әрине, негізгі urls.py файлы осы қолданбаға сұрау жіберілетін үлгіні көрсетеді.
urlpatterns = [ url(r'^', include('home.urls')), ]
Үй қолданбасының url үлгісіне келетін болсақ, ол келесідей болады:
from django.conf.urls import url from . import views app_name = 'home' urlpatterns = [ ... url(r'^contacts/$', views.EContactsView.as_view(), name='contacts'), ... ]
Байланыс формасы
Байланыс пішінінде үш өріс бар:
- Аты – пайдаланушы өзін таныстыруы керек;
- электрондық пошта – пайдаланушы оған жауап беру үшін өзінің электрондық пошта мекенжайын көрсетуі керек;
- Хабарлама – тікелей пайдаланушы жібергісі келетін хабарлама.
Барлық өрістер міндетті болады. Бұл жағдайда электрондық поштаны енгізудің дұрыстығын тексеру пайдаланушы браузерінде жүзеге асырылады.
# -*- coding: utf-8 -*- from django import forms class ContactForm(forms.Form): name = forms.CharField( label="Имя", widget=forms.TextInput ) email = forms.EmailField( widget=forms.EmailInput ) message = forms.CharField( label="Сообщение", widget=forms.Textarea )
Өнімділік
Енді біз хабарламаны өңдеуге және байланыс пішіні бар бетті көрсетуге жауапты болатын көрініс жазамыз.
from django.shortcuts import render_to_response, reverse from django.views import View from django.core.mail import send_mail from .forms import ContactForm from project import settings class EContactsView(View): template_name = 'home/contacts.html' # В случае get запроса, мы будем отправлять просто страницу с контактной формой def get(self, request, *args, **kwargs): context = {} context.update(csrf(request)) # Обязательно добавьте в шаблон защитный токен context['contact_form'] = ContactForm() return render_to_response(template_name=self.template_name, context=context) def post(self, request, *args, **kwargs): context = {} form = ContactForm(request.POST) # Если не выполнить проверку на правильность ввода данных, # то не сможем забрать эти данные из формы... хотя что здесь проверять? if form.is_valid(): email_subject = 'EVILEG :: Сообщение через контактную форму ' email_body = "С сайта отправлено новое сообщение\n\n" \ "Имя отправителя: %s \n" \ "E-mail отправителя: %s \n\n" \ "Сообщение: \n" \ "%s " % \ (form.cleaned_data['name'], form.cleaned_data['email'], form.cleaned_data['message']) # и отправляем сообщение send_mail(email_subject, email_body, settings.EMAIL_HOST_USER, ['target_email@example.com'], fail_silently=False) return render_to_response(template_name=self.template_name, context=context)
Бұл жерде беттің пайдаланушыға қалай көрсетілетініне қатысты бір маңызды мәселе бар. Егер пайдаланушы хат жіберген болса, оған хат жіберілгені туралы хабарлау қажет. Мұны істеу үшін біз жай ғана контекстке байланыс пішінін орналастырмаймыз және пайдаланушыға дұрыс ақпаратты көрсету үшін үлгіде оның бар-жоғын тексереміз.
Байланыс пішінінің үлгісі
Байланыс пішінінде сайтыңызды контакт пішіні арқылы шабуылдардан қорғайтын {% csrf_token %} көрсетуіңіз керек. Сондай-ақ, дұрыс және әдемі бет көрінісін жасауға мүмкіндік беретін bootsrtap3 модулін жүктеуді ұмытпаңыз.
bootstrap3 модулімен байланыс пішінін пайдалану үшін сізге сәйкес үлгі тегін көрсетіңіз және оған біздің байланыс пішінін жіберсеңіз жеткілікті. Сондай-ақ, сіздердің назарларыңызды байланыс формасының қолжетімділігіне қарай беттің басқа көрінісі көрсетілетініне аударамын.
{% extends 'home/base.html' %}{% load bootstrap3 %} {% block title %}Контакты{% endblock %} {% block page %} <h1>Контакты</h1> <article> {% if contact_form %} <p>Добро пожаловать на сайт.</p> <p>Если у Вас есть пожелания или предложения по улучшению сайта, либо Вы желаете предложить статью к публикации на сайте, то Вы можете сделать это, воспользовавшись контактной формой:</p> <form id="contact_form" action="{% url 'home:contacts' %}" method="post"> {% csrf_token %} {% bootstrap_form contact_form %} {% buttons %} <button type="submit" class="btn btn-primary">{% bootstrap_icon "send" %} Отправить</button> {% endbuttons %} </form> {% else %} <p>Сообщение отправлено</p> {% endif %} </article> {% endblock %}
Django үшін Timeweb хостының VDS сервері ұсынамын.
Байланыс пішінінің коды forms.py файлында орналасады.
Не полноценное решение, сильно вырвано из контекста.
Здавствуйте! обязательно ли форма в django должна быть привязана к модели? конкретно в этом случаи
Добрый день. Конкретно в этом случае модель не привязана к форме вообще потому, что здесь модель не используется. Вы можете использовать модель, чтобы дополнительно сохранять сообщения в базе данных сайта.
Добрый день,
не могу отправить загруженный файл, подскажите что нужно еще добавить.
Спасибо.
Добрый день.
Потому, что нужно не добавлять ссылку (или что там у вас в итоге получается) на файл и прикреплять его к письму.
Если не ошибаюсь, то для отправки письма с файлом нужно использовать класс EmailMessage
Могут быть некоторые разночтения в синтаксисе, в зависимости от версий Django
Добрый день, в итоге получилось как-то так, отправляет форму с файлом.
Спасибо.
Добрый день,
при отправки письма с файлом, выбираю несколько файлов, пишет выбранное количество файлов, а отправляет только один, весь код см.выше, добавил только в форму возможность выбора нескольких файлов. Подскажите,что нужно еще добавить, чтобы можно было отправить сразу несколько файлов.
Спасибо.
Думаю, что как-то так, возможно неправильно написание имени метода getlist, но выглядеть должно так
Спасибо, Евгений.
Все заработало.
Timeweb так себе провайдер.
Поддержка не отвечает. И smtp не отправляет письма.
Все перепробовал ничего найти не могу.
1. Ошибка sock.connect(sa) TimeoutError: [Errno 110] Connection timed out
2. Ошибка OSError: [Errno 101] Network is unreachable