Django 表单没有按应有的方式保存或通过电子邮件发送
Django form not saving or emailing as it should
我构建了一个简单的表单,应该在提交表单时发送电子邮件,并保存到数据库中的 table。由于我仍在学习 Django,因此我通过遵循不同的教程来完成此操作。目前,它应该配置为将电子邮件输出到控制台,而不是按照我遵循的教程实际发送电子邮件。
我没有收到任何错误,并且在发布表单时控制台显示了 HTTP 200 成功代码,所以它似乎可以正常工作,但是由于没有任何内容被保存并且没有电子邮件被打印到控制台,我'我不确定发生了什么。
我的models.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 或模板等的错误,所以我想我已经包含了所有相关信息。据我所知,一切都已正确配置。
为什么提交表单后没有发送电子邮件,也没有记录保存到数据库中?
the console shows a HTTP 200 success code
这表明表单无效。如果表单有效,您将在发送电子邮件后重定向,因此您会看到状态代码 302。
在视图中,您应该将 表单 而不是表单 class 传递给模板。这样您应该会看到表单模板中呈现的任何错误(假设您使用 {{ 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)
。控制台中的输出将帮助您调试视图运行时发生的情况。
我构建了一个简单的表单,应该在提交表单时发送电子邮件,并保存到数据库中的 table。由于我仍在学习 Django,因此我通过遵循不同的教程来完成此操作。目前,它应该配置为将电子邮件输出到控制台,而不是按照我遵循的教程实际发送电子邮件。
我没有收到任何错误,并且在发布表单时控制台显示了 HTTP 200 成功代码,所以它似乎可以正常工作,但是由于没有任何内容被保存并且没有电子邮件被打印到控制台,我'我不确定发生了什么。
我的models.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 或模板等的错误,所以我想我已经包含了所有相关信息。据我所知,一切都已正确配置。
为什么提交表单后没有发送电子邮件,也没有记录保存到数据库中?
the console shows a HTTP 200 success code
这表明表单无效。如果表单有效,您将在发送电子邮件后重定向,因此您会看到状态代码 302。
在视图中,您应该将 表单 而不是表单 class 传递给模板。这样您应该会看到表单模板中呈现的任何错误(假设您使用 {{ 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)
。控制台中的输出将帮助您调试视图运行时发生的情况。