表单处理 #

什么是 Netlify Forms? #

Netlify Forms 是一个内置的表单处理服务,无需编写后端代码即可处理表单提交。

text
用户提交表单 → Netlify 自动处理 → 存储并发送通知

优势 #

优势 说明
零后端 无需服务器或 API
自动存储 提交数据自动保存
邮件通知 新提交自动通知
反垃圾 内置垃圾过滤
Webhook 支持集成其他服务

基本使用 #

HTML 表单 #

最简单的方式是在 HTML 表单中添加 data-netlify="true" 属性:

html
<form name="contact" method="POST" data-netlify="true">
  <p>
    <label>姓名:<input type="text" name="name" /></label>
  </p>
  <p>
    <label>邮箱:<input type="email" name="email" /></label>
  </p>
  <p>
    <label>消息:<textarea name="message"></textarea></label>
  </p>
  <p>
    <button type="submit">提交</button>
  </p>
</form>

关键属性 #

属性 说明
name 表单名称,用于识别
method="POST" 必须使用 POST 方法
data-netlify="true" 启用 Netlify Forms

表单类型 #

联系表单 #

html
<form name="contact" method="POST" data-netlify="true">
  <input type="text" name="name" placeholder="姓名" required />
  <input type="email" name="email" placeholder="邮箱" required />
  <textarea name="message" placeholder="留言"></textarea>
  <button type="submit">发送</button>
</form>

订阅表单 #

html
<form name="subscribe" method="POST" data-netlify="true">
  <input type="email" name="email" placeholder="邮箱地址" required />
  <button type="submit">订阅</button>
</form>

文件上传表单 #

html
<form name="upload" method="POST" data-netlify="true" enctype="multipart/form-data">
  <input type="text" name="name" placeholder="姓名" />
  <input type="file" name="attachment" />
  <button type="submit">上传</button>
</form>

React 表单 #

方式一:隐藏表单 #

jsx
function ContactForm() {
  return (
    <form 
      name="contact" 
      method="POST" 
      data-netlify="true"
      netlify-honeypot="bot-field"
    >
      <input type="hidden" name="form-name" value="contact" />
      <p hidden>
        <label>
          不要填写:<input name="bot-field" />
        </label>
      </p>
      <input type="text" name="name" placeholder="姓名" required />
      <input type="email" name="email" placeholder="邮箱" required />
      <textarea name="message" placeholder="留言"></textarea>
      <button type="submit">发送</button>
    </form>
  )
}

方式二:JavaScript 提交 #

jsx
import { useState } from 'react'

function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: ''
  })

  const handleSubmit = async (e) => {
    e.preventDefault()
    
    const data = new FormData()
    data.append('form-name', 'contact')
    data.append('name', formData.name)
    data.append('email', formData.email)
    data.append('message', formData.message)

    await fetch('/', {
      method: 'POST',
      body: data
    })

    alert('提交成功!')
  }

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        name="name"
        value={formData.name}
        onChange={(e) => setFormData({...formData, name: e.target.value})}
        placeholder="姓名"
        required
      />
      <input
        type="email"
        name="email"
        value={formData.email}
        onChange={(e) => setFormData({...formData, email: e.target.value})}
        placeholder="邮箱"
        required
      />
      <textarea
        name="message"
        value={formData.message}
        onChange={(e) => setFormData({...formData, message: e.target.value})}
        placeholder="留言"
      />
      <button type="submit">发送</button>
    </form>
  )
}

Vue 表单 #

vue
<template>
  <form 
    name="contact" 
    method="POST" 
    data-netlify="true"
    @submit.prevent="handleSubmit"
  >
    <input type="hidden" name="form-name" value="contact" />
    <input 
      type="text" 
      name="name" 
      v-model="form.name" 
      placeholder="姓名"
      required 
    />
    <input 
      type="email" 
      name="email" 
      v-model="form.email" 
      placeholder="邮箱"
      required 
    />
    <textarea 
      name="message" 
      v-model="form.message" 
      placeholder="留言"
    />
    <button type="submit">发送</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        email: '',
        message: ''
      }
    }
  },
  methods: {
    async handleSubmit() {
      const data = new FormData()
      data.append('form-name', 'contact')
      data.append('name', this.form.name)
      data.append('email', this.form.email)
      data.append('message', this.form.message)

      await fetch('/', {
        method: 'POST',
        body: data
      })

      alert('提交成功!')
    }
  }
}
</script>

表单通知 #

邮件通知 #

text
Site settings → Forms → Form notifications → Add notification → Email

配置选项:

  • 通知邮箱地址
  • 邮件主题

Slack 通知 #

text
Site settings → Forms → Form notifications → Add notification → Slack

需要配置 Slack Webhook URL。

Webhook 通知 #

text
Site settings → Forms → Form notifications → Add notification → Webhook

Webhook 载荷示例:

json
{
  "data": {
    "name": "张三",
    "email": "zhangsan@example.com",
    "message": "这是一条测试消息"
  },
  "form_name": "contact",
  "form_id": "xxx",
  "site_url": "https://example.com",
  "created_at": "2024-01-01T00:00:00.000Z"
}

查看提交 #

控制台查看 #

text
Forms → 选择表单 → 查看提交列表

提交信息 #

每条提交包含:

  • 提交时间
  • 表单字段值
  • 来源页面
  • 用户 IP(部分)

导出提交 #

text
Forms → 选择表单 → Download CSV

反垃圾 #

Honeypot 字段 #

添加隐藏字段,机器人填写后会被标记为垃圾:

html
<form name="contact" method="POST" data-netlify="true" netlify-honeypot="bot-field">
  <p hidden>
    <label>
      不要填写:<input name="bot-field" />
    </label>
  </p>
  <!-- 其他字段 -->
</form>

reCAPTCHA #

启用 Google reCAPTCHA:

html
<form name="contact" method="POST" data-netlify="true" data-netlify-recaptcha="true">
  <!-- 表单字段 -->
  <div data-netlify-recaptcha="true"></div>
  <button type="submit">提交</button>
</form>

垃圾过滤 #

Netlify 内置垃圾过滤:

  • 自动检测垃圾提交
  • 可手动标记/取消标记
  • 垃圾提交不计入配额

自定义感谢页面 #

配置方式 #

html
<form 
  name="contact" 
  method="POST" 
  data-netlify="true"
  action="/thank-you"
>
  <!-- 表单字段 -->
</form>

提交后跳转到 /thank-you 页面。

感谢页面示例 #

html
<!DOCTYPE html>
<html>
<head>
  <title>感谢提交</title>
</head>
<body>
  <h1>感谢您的提交!</h1>
  <p>我们会尽快回复您。</p>
  <a href="/">返回首页</a>
</body>
</html>

表单限制 #

免费方案限制 #

限制项 免费额度
每月提交数 100 条
文件上传 10MB
保留时间 30 天

超出限制 #

  • 超出后新提交会被拒绝
  • 升级 Pro 方案可增加配额

表单 API #

获取表单列表 #

bash
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://api.netlify.com/api/v1/sites/YOUR_SITE_ID/forms

获取提交列表 #

bash
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://api.netlify.com/api/v1/forms/FORM_ID/submissions

获取单个提交 #

bash
curl -H "Authorization: Bearer YOUR_TOKEN" \
  https://api.netlify.com/api/v1/submissions/SUBMISSION_ID

常见问题 #

Q: 表单提交后显示 404? #

确保表单有正确的 name 属性和 data-netlify="true"

Q: React 表单不工作? #

确保添加隐藏字段:

html
<input type="hidden" name="form-name" value="contact" />

Q: 如何处理文件上传? #

添加 enctype="multipart/form-data"

html
<form enctype="multipart/form-data" ...>

Q: 如何防止垃圾提交? #

使用 honeypot 字段和 reCAPTCHA。

最佳实践 #

1. 使用 Honeypot #

简单有效的反垃圾方法。

2. 添加验证 #

html
<input type="email" name="email" required />
<input type="text" name="name" minlength="2" required />

3. 设置感谢页面 #

提供良好的用户体验。

4. 配置通知 #

及时了解新提交。

5. 定期清理 #

导出并清理旧提交数据。

下一步 #

掌握了表单处理后,继续学习 Serverless Functions 扩展站点功能!

最后更新:2026-03-28