基于表单布尔值Trigger_Email实现Django邮件发送功能求助
Django 基于布尔字段触发邮件发送的修正方案
问题分析
原代码存在以下逻辑错误:
get_object_or_404(New_Shipment)未传入查询条件,会直接抛出404错误- 逻辑分支顺序错误,
elif无法正确触发,且未正确获取表单提交后的实例 - 邮件发送代码位置错误,未关联表单提交的实际数据
修正后的代码
models.py(无需修改)
class New_Shipment(models.Model): Status_CHOICES = ( ("1", "Open"), ("2", "Close"), ) alphanumeric = RegexValidator(r'^[\s0-9a-zA-Z\.-_]*$', 'Only alphanumeric characters are allowed.') Courier_or_Freight_details = models.CharField(max_length=200, validators=[alphanumeric]) Quantity = models.IntegerField() Action_On = models.CharField(max_length=200, validators=[alphanumeric]) Status = models.CharField(max_length=300, validators=[alphanumeric], choices=Status_CHOICES) Trigger_Email = models.BooleanField(default=False)
views.py(核心修正)
from django.shortcuts import render from django.http import HttpResponse from django.core.mail import send_mail from django.conf import settings from .models import New_Shipment from .forms import MyForm1 def my_form1(request): if request.method == "POST": form1 = MyForm1(request.POST) if form1.is_valid(): # 获取未保存的实例,先判断触发条件 new_shipment = form1.save(commit=False) if new_shipment.Trigger_Email: subject = "New Shipment Details" message = "Hello \n New Shipment details added to the EPC\n\n Regards,\nIsmail" from_email = settings.EMAIL_HOST_USER to_list = ['toemail@gmail.com'] # 关闭fail_silently方便调试邮件配置问题 send_mail(subject, message, from_email, to_list, fail_silently=False) # 保存实例到数据库 new_shipment.save() return HttpResponse('Submitted successfully') # return redirect('home_page') # 推荐用命名路由跳转 else: form1 = MyForm1() return render(request, "authentication/New_shipment.html", {'form1': form1})
urls.py(优化写法)
from django.urls import path, include from . import views urlpatterns = [ path('', views.home, name="home"), path('signup', views.signup, name="signup"), path('activate/<uidb64>/<token>', views.activate, name='activate'), path('signin', views.signin, name="signin"), path('Monthly_Shipment', views.Monthly_Shipment, name="Monthly_Shipment"), path('signout', views.signout, name="signout"), path('home_page', views.home_page, name="home_page"), path('form1', views.my_form1, name='form1'), # 用path替代过时的url函数 path('View_New_shipment', views.View_New_shipment, name="View_New_shipment"), ]
关键修正说明
- 使用
form1.save(commit=False)获取表单对应的模型实例,在保存前判断Trigger_Email字段值,确保触发逻辑关联用户提交的实际数据 - 调整逻辑顺序,将邮件发送放在表单验证通过后、实例保存前(或保存后均可)
- 移除视图函数中不必要的
new_shipment参数,避免混淆模型类与实例 - 建议关闭
fail_silently=False,邮件配置错误时能及时抛出异常便于调试
内容的提问来源于stack exchange,提问作者ISMAIL MULLA
相关产品推荐
相关产品推荐

