Um die Entwicklung der Site fortzusetzen, möchte ich ein Codebeispiel zum Hinzufügen eines Kontaktformulars auf einer Site in Django teilen. Es gab bereits Artikel mit verschiedenen Formularen, zum Beispiel zum Hinzufügen von Kommentaren, aber da wir über den gesamten Prozess sprechen, werden wir auch dieses Thema nicht umgehen.
Außerdem war es für eine Seite auf Wordpress ein wundes Thema für mich. An allem war wohl Faulheit schuld, denn ich hatte nie die Lust, mich mit PHP zu beschäftigen, um selbst ein Kontaktformular zu skizzieren (daher war ein weiteres Plugin involviert).
Und wenn man bedenkt, dass die Entwicklung auf Django eine recht häufige Arbeit mit verschiedenen Datenformen voraussetzt und gleichzeitig ein Modul für die Arbeit mit Mail vorhanden ist Dienstleistungen, dann ist das Hinzufügen eines ähnlichen Formulars nicht schwierig.
Einrichten von settings.py, urls.py, home / urls.py
Als erstes richten wir die Konfigurationsdatei ein, da sie die Daten für die Verbindung mit der Mailbox angeben muss, aus der der Brief mit dem Inhalt des Kontaktformulars gesendet wird.
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, с которого будет отправлено письмо
Außerdem müssen Sie in dieser Datei die Anwendung angeben, die für das Kontaktformular verantwortlich ist. In meinem Fall ist dies die Home-Anwendung, die für selten wechselnde Seiten zuständig ist, zum Beispiel eine Seite mit einem Kontaktformular. Und auch das auf der Website verwendete Modul django-bootstrap3
INSTALLED_APPS = [ ... 'home.apps.HomeConfig', 'bootstrap3', ... ]
Natürlich gibt die Hauptdatei urls.py die Vorlage an, nach der die Anfrage an diese Anwendung gesendet wird.
urlpatterns = [ url(r'^', include('home.urls')), ]
Die URL-Vorlage für die Heimanwendung sieht so aus:
from django.conf.urls import url from . import views app_name = 'home' urlpatterns = [ ... url(r'^contacts/$', views.EContactsView.as_view(), name='contacts'), ... ]
Kontakt Formular
Das Kontaktformular hat drei Felder:
- Name - der Benutzer muss sich vorstellen;
- E-Mail – der Benutzer muss seine E-Mail-Adresse angeben, um ihm antworten zu können;
- Nachricht - direkt die Nachricht selbst, die der Benutzer senden möchte.
Alle Felder werden benötigt. Die Überprüfung der Richtigkeit der E-Mail-Eingabe erfolgt in diesem Fall im Browser des Nutzers.
# -*- 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 )
Vertretung
Lassen Sie uns nun eine Ansicht schreiben, die für die Verarbeitung der Nachricht und die Anzeige der Seite mit dem Kontaktformular verantwortlich ist.
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)
Es gibt hier einen wichtigen Punkt bezüglich der Darstellung der Seite für den Benutzer. Wenn der Nutzer einen Brief verschickt hat, muss er darüber informiert werden, dass der Brief versendet wurde. Dazu stellen wir das Kontaktformular lediglich nicht in den Kontext und prüfen dessen Vorhandensein in der Vorlage, um dem Nutzer die richtigen Informationen anzuzeigen.
Kontaktformular Vorlage
Im Kontaktformular müssen Sie {% csrf_token%} angeben, um Ihre Site vor Angriffen über das Kontaktformular zu schützen. Vergessen Sie auch nicht, das Bootsrtap3-Modul zu laden, mit dem Sie eine korrektere und schönere Ansicht der Seite erstellen können.
Um ein Kontaktformular mit dem bootstrap3 Modul zu verwenden, müssen Sie nur das entsprechende Template-Tag angeben und unser Kontaktformular darin übergeben. Außerdem möchte ich Sie darauf aufmerksam machen, dass je nach Verfügbarkeit des Kontaktformulars ein anderes Erscheinungsbild der Seite angezeigt wird.
{% 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 %}
Für Django empfehle ich Timeweb VDS-Server .
Der Kontaktformularcode befindet sich in der Datei 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