首页 > 解决方案 > Django 表单未按应有的方式保存或发送电子邮件

问题描述

我已经构建了一个简单的表单,它应该在表单提交时发送电子邮件,并保存到数据库中的表中。我已经按照不同的教程完成了这项工作,因为我仍在学习 Django。目前,根据我遵循的教程,它应该配置为将电子邮件输出到控制台,而不是实际发送电子邮件。

我没有收到任何错误,并且在发布表单时控制台会显示 HTTP 200 成功代码,因此它似乎可以正常工作,但是由于没有保存任何内容并且没有将电子邮件打印到控制台,我不确定是什么继续。

我的模型.py:

from __future__ import unicode_literals
from django.db import models
from multiselectfield import MultiSelectField

class Booking(models.Model):
    timeslot = (
        ('EM', 'Early Morning'),
        ('LM', 'Late Morning'),
        ('EA', 'Early Afternoon'),
        ('LA', 'Late Afternoon'),
    )
    services = (
        ('gutters', 'Gutter Cleaning'),
        ('windows', 'Window Cleaning'),
        ('decks', 'Deck Staining'),
        ('painting', 'Painting'),
    )
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.CharField(max_length=30)
    phone = models.CharField(max_length=30)
    booking_time = models.CharField(max_length=1, choices=timeslot)
    selected_services = MultiSelectField(choices=services)

我的views.py的相关部分:

def booking_new(request):
    form_class = BookingForm

    # new logic!
    if request.method == 'POST':
        form = form_class(data=request.POST)

        if form.is_valid():
            first_name = request.POST.get(
                'first_name'
            , '')
            last_name = request.POST.get(
                'last_name'
            , '')
            email = request.POST.get(
                'email'
            , '')
            phone = request.POST.get(
                'phone'
            , '')
            booking_time = request.POST.get(
                'booking_time'
            , '')
            selected_services = request.POST.get(
                'selected_services'
            , '')
            form_content = request.POST.get('content', '')

            template = get_template('email_template.txt')
            context = {
                'first_name': first_name,
                'last_name': last_name,
                'email': email,
                'form_content': form_content,
            }
            content = template.render(context)

            email = EmailMessage(
                "New contact form submission",
                content,
                "Your website" +'',
                ['youremail@gmail.com'],
                headers = {'Reply-To': contact_email }
            )
            email.send()
            form.save()
            return redirect('booking_new')

    return render(request, 'home/booking_edit.html', {
        'form': form_class,
    })

我的forms.py:

from django import forms

from .models import Booking

class BookingForm(forms.ModelForm):

    class Meta:
        model = Booking
        fields = ('first_name', 'last_name', 'email', 'phone', 'booking_time', 'selected_services') 

我的 settings.py 结束:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
DEFAULT_FROM_EMAIL = 'testing@example.com'
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
EMAIL_PORT = 1025

我没有收到任何关于缺少导入或 URL 或模板等的错误,所以我认为我已经包含了所有相关信息。据我所见,一切都已正确配置。

为什么我的表单提交时没有发送电子邮件,也没有记录保存到数据库中?

标签: djangodjango-formsdjango-email

解决方案


控制台显示 HTTP 200 成功代码

这表明该表格无效。如果表单有效,您将在发送电子邮件后重定向,因此您会看到状态代码 302。

在视图中,您应该将表单传递给模板而不是表单类。这样,您应该会看到表单模板中呈现的任何错误(假设您使用{{ form }})。

if request.method == 'POST':
    form = form_class(data=request.POST)
    ...
else:
    form = form_class()  # Blank form for GET request 

return render(request, 'home/booking_edit.html', {
    'form': form,
})

您可能还会发现添加打印语句很有用(例如print(form.is_valid())print(form.errors)。控制台中的输出将帮助您调试视图运行时发生的情况。


推荐阅读