You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于表单布尔值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:10:26