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

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个重复混乱的参数,第四个位置传的是用户填写的地址字符串,自然不符合参数要求。


修复步骤

  1. 修正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', {})
  1. 修正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
  1. 修正contact.html模板的textarea错误

textarea标签没有value属性,需要把默认值放在标签中间:

<textarea name="message" id="message" class="form-control" placeholder="Your Message">{{values.message}}</textarea>

内容的提问来源于stack exchange,提问作者Tech World

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:04