Django contact form提交报错"to" argument must be a list or tuple如何解决
报错根本原因
你调用send_mail()函数时传递的参数完全不符合Django官方要求的参数顺序,导致本应是收件人列表的第四个位置被你传了字符串类型的address字段,所以触发了「"to" argument must be a list or tuple」错误。
Django send_mail() 的正确参数顺序如下:
send_mail( 邮件主题, # 第一个参数 subject 邮件内容, # 第二个参数 message 发件人邮箱, # 第三个参数 from_email 收件人列表, # 第四个参数 recipient_list,必须是列表/元组 # 后面为可选参数,无特殊需求可以不传 )
你当前传了8个重复混乱的参数,第四个位置传的是用户填写的地址字符串,自然不符合参数要求。
修复步骤
修正views.py的逻辑
先做表单验证,验证通过后再发邮件+存数据库,同时修正send_mail的参数,修改后的contact函数代码如下:
def contact(request): if request.method == 'POST': name = request.POST['name'] phone = request.POST['phone'] email = request.POST['email'] address = request.POST['address'] subject = request.POST['subject'] message = request.POST['message'] timingschedule = request.POST['timingschedule'] # 模板中存在该字段,补充取值 form_data = {'name': name, 'phone': phone, 'email': email, 'address': address, 'subject': subject, 'message': message, 'timingschedule': timingschedule} # 表单验证逻辑,修正原来elif顺序错误的问题 error_message = None if not name: error_message = "姓名不能为空!" elif len(name) < 3: error_message = "姓名长度不能少于3个字符" elif not phone: error_message = "手机号不能为空" elif len(phone) < 10: error_message = "手机号长度不能少于10位" elif not subject: error_message = "请填写主题" elif not message: error_message = "请填写留言内容" if error_message: # 验证失败返回错误提示 return render(request, 'contact.html', {'error': error_message, 'values': form_data}) # 验证通过后再发邮件+存储数据 # 组合完整邮件内容 email_content = f""" 用户留言信息: 姓名:{name} 电话:{phone} 邮箱:{email} 地址:{address} 预约时间:{timingschedule} 主题:{subject} 留言内容:{message} """ send_mail( subject = f"网站新留言:{subject}", message = email_content, from_email = 'mail@domain.com', recipient_list = ['toemail@gmail.com',], fail_silently = False ) # 保存数据到数据库 contact = Contact(name=name, phone=phone, email=email, address=address, subject=subject, message=message) contact.save() # 返回成功提示 return render(request, 'contact.html', {'name': name, 'values': form_data}) else: return render(request, 'contact.html', {})
修正settings.py的邮件配置
465端口是SSL协议的专用端口,不支持TLS,修改配置如下:
EMAIL_HOST = 'mail.domain.com' EMAIL_PORT = 465 EMAIL_HOST_USER = 'mail@domain.com' EMAIL_HOST_PASSWORD = '你的邮箱授权码/密码' EMAIL_USE_SSL = True # 替换原来的EMAIL_USE_TLS = True
修正contact.html模板的textarea错误
textarea标签没有value属性,需要把默认值放在标签中间:
<textarea name="message" id="message" class="form-control" placeholder="Your Message">{{values.message}}</textarea>
内容的提问来源于stack exchange,提问作者Tech World
相关产品推荐
相关产品推荐

