Контактная форма Django с Bootstrap - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть приложение под названием contact, которое отображает extends из home.html с нижним колонтитулом / заголовком. Я положил туда форму начальной загрузки с кодом ниже:

<div class="form-area">  
        <form role="form">

                    <div class="form-group">
                        <input type="text" class="form-control" id="name" name="name" placeholder="Name" maxlength="70" required>
                    </div>
                    <div class="form-group">
                        <input type="text" class="form-control" id="email" name="email" placeholder="Email" required>
                    </div>

                    <div class="form-group">
                        <input type="text" class="form-control" id="subject" name="subject" placeholder="Subject" maxlength="70" required>
                    </div>
                    <div class="form-group">
                    <textarea class="form-control" type="textarea" id="message" placeholder="Message" maxlength="300" rows="7"></textarea>                
                    </div>

        <button type="button" id="submit" name="submit" class="btn btn-m btn-secondary">Submit Form</button>
        </form>

Я хочу отправлять электронные письма, используя эту форму, я уже знаю, что мне следует использовать грубые формы, но я не знаю, с чего начать. Я не уверен, должен ли я создать модель или форму в Django. Есть несколько учебных пособий, которые показывают логику электронной почты и шаблоны, но они используют встроенные формы.

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Сначала добавьте конфигурацию электронной почты в settings.py:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'email@gmail.com'
EMAIL_HOST_PASSWORD = 'EMAIL_PASSWORD'
DEFAULT_FROM_EMAIL = 'webmaster@localhost'

Далее мы настроим несколько URL-адресов, которые могут быть направлены на наши представления. Обновите urls.py (импортируйте представления из любого места):

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

#For development
#EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Теперь нам нужно настроить сам файл form.py:

from django import forms
class ContactForm(forms.Form):
    contact_name = forms.CharField(required=True, label="Name")
    contact_email = forms.EmailField(required=True, label="Email")
    content = forms.CharField(
        required=True,
        widget=forms.Textarea,
        label="Message"
    )

Вот полный файл views.py с пояснениями ниже:

from django.core.mail import BadHeaderError, EmailMessage
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .forms import ContactForm

def contact(request):
    if request.method == 'GET':
        form = ContactForm()
    else:
        form = ContactForm(request.POST)
        if form.is_valid():
            contact_name = form.cleaned_data['contact_name']
            contact_email = form.cleaned_data['contact_email']
            content = form.cleaned_data['content']
            try:
                email = EmailMessage(contact_name,
                                    content,
                                    contact_email,
                                    ['youremail@gmail.com'], #change to your email
                                     reply_to=[contact_email],
                                   )
                email.send()
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            return redirect('./thanks/')
    return render(request, 'home/contact.html', {'form': form})


def thanks(request):
    return render(request, 'home/thanks.html', {)
0 голосов
/ 17 ноября 2018

ОК, все заработало. Оказывается, что-то не так с формой начальной загрузки. Также разобрали Джанго таким образом:

views.py:

def contact(request):
    #check for POST requests on load.
    request.method == 'POST'
    subject = request.POST.get('subject')
    message = request.POST.get('message')
    email = request.POST.get('email')

    if subject and message and email:
        try:
            send_mail(subject, message, email, ['adam1edinburgh@gmail.com'])
        except BadHeaderError:
            return HttpResponse('Invalid header found.') 
        return HttpResponse('Thanks for your email')

    else:
        #loading contacts.html if no requests
        return render(request, 'personal/contact.html')

Это немного странно, но я сначала проверяю, есть ли какие-либо запросы POST и, конечно, их нет, потому что HTML отображается, если нет запросов.

Код формы, неправильный тип кнопки. Итак, я изменился. Также токен csrf оказывается обязательным.

<div class="form-area">  
        <form role="form" method="POST">
                    {% csrf_token %}
                        <input type="text" class="form-control" id="subject" name="subject" placeholder="Subject" maxlength="70" required>
                    </div>
                    <br>
                    <div class="form-group">
                        <input type="email" class="form-control" id="email" name="email" placeholder="Email" required>
                    </div>

                    <div class="form-group">
                    <textarea class="form-control" type="textarea" id="message" name="message" placeholder="Message" maxlength="300" rows="7"></textarea>                
                    </div>

        <button type="submit"  name="submit" class="btn btn-m btn-secondary">Submit</button>
        </form>

Спасибо всем за помощь !!!

0 голосов
/ 16 ноября 2018

HTML-файл baar.html

<div class="form-area">  
        <form role="form" method="post">

                    <div class="form-group">
                        <input type="text" class="form-control" id="name" name="name" placeholder="Name" maxlength="70" required>
                    </div>
                    <div class="form-group">
                        <input type="text" class="form-control" id="email" name="email" placeholder="Email" required>
                    </div>

                    <div class="form-group">
                        <input type="text" class="form-control" id="subject" name="subject" placeholder="Subject" maxlength="70" required>
                    </div>
                    <div class="form-group">
                    <textarea class="form-control" type="textarea" id="message" placeholder="Message" maxlength="300" rows="7"></textarea>                
                    </div>

        <button type="button" id="submit" name="submit" class="btn btn-m btn-secondary">Submit Form</button>
        </form>

View.py

from django.shortcuts import render, redirect
from django.core.mail import send_mail
from django.conf import settings
def fooview(request):
    if request.method=="POST":
        name=request.POST.get('name')
        email=request.POST.get('email')
        subject=request.POST.get('subject')
        message=request.POST.get('message')
        send_mail(subject= subject,message= message,from_email=settings.DEFAULT_FROM_EMAIL,recipient_list = [email],fail_silently  = True,)
        return redirect('fooview')
    return render(request,'baar.html',{})

settings.py

DEFAULT_FROM_EMAIL='someemail@gmail.com'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...