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

Django+Vue邮件订阅模块禁止重复邮箱注册实现咨询

Newsletter 重复邮箱订阅校验实现方案

1. 数据库层加唯一约束(根本防重)

首先修改models.py里的Subscriber模型,给email字段加唯一索引,从数据库层面杜绝重复数据写入:

from django.db import models

class Subscriber(models.Model):
    # 加unique=True约束,不允许重复邮箱
    email = models.EmailField(max_length=255, unique=True)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s' % self.email

改完模型后在项目目录执行两条命令生成并应用数据库迁移:

python manage.py makemigrations
python manage.py migrate

2. 编写后端接口逻辑

你的views.py目前是空的,直接写入订阅接口逻辑,校验邮箱是否已存在,返回对应状态码和提示信息:

from django.http import JsonResponse
from .models import Subscriber
import json

def add_subscriber(request):
    if request.method != "POST":
        return JsonResponse({"error": "Method not allowed"}, status=405)
    
    # 解析前端传的JSON数据
    data = json.loads(request.body)
    email = data.get("email", "").strip()
    
    # 校验邮箱是否已存在(不区分大小写)
    if Subscriber.objects.filter(email__iexact=email).exists():
        # 邮箱重复返回400状态和指定提示
        return JsonResponse({"error": "email is already in use"}, status=400)
    
    # 邮箱不存在则创建订阅记录
    Subscriber.objects.create(email=email)
    return JsonResponse({"success": True}, status=200)

写完视图后记得配置路由,在对应app的urls.py里添加路由规则(如果没有该文件就新建):

from django.urls import path
from . import views

urlpatterns = [
    path('api/add_subscriber/', views.add_subscriber, name='add_subscriber'),
]

再确认项目根目录的urls.py已经include了这个app的路由配置,否则接口无法访问。

3. 修改前端模板的交互逻辑

原来的前端代码没有错误提示位,也没有处理接口返回的异常状态,按下面修改:
首先在表单的提示区加错误提示块,放在原有成功提示的上方即可:

<!-- 新增错误提示块 -->
<div class="alert alert-danger" role="alert" v-if="showError">
    {{ errorMsg }}
</div>
<!-- 原有成功提示保留 -->
<div class="alert alert-success" role="alert" v-if="showSuccess">
    You are Subscribed to our Newsletter!
</div>

然后修改Vue实例的代码,补充错误状态和响应处理逻辑,同时修复原代码catch块内this指向错误的问题:

var newsletterapp = new Vue({
    el: '#newsletter-wrapper',
    data () {
        return {
            email: '',
            showSuccess: false,
            // 新增错误提示相关状态
            showError: false,
            errorMsg: ''
        }
    },
    methods: {
        onSubmit() {
            // 提交前先清空所有旧提示
            this.showSuccess = false
            this.showError = false

            fetch('/api/add_subscriber/', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'X-CSRFToken': '{{ csrf_token }}'
                    },
                    body: JSON.stringify({'email': this.email})
                })
                .then(async (response) => {
                    const data = await response.json()
                    if (!response.ok) {
                        // 接口返回错误状态,抛出错误给后续catch处理
                        return Promise.reject(data)
                    }
                    return data
                })
                .then((data) => {
                    console.log(data)
                    this.showSuccess = true
                    this.email = ''
                })
                .catch((error) => {
                    // 箭头函数保证this指向Vue实例,显示错误提示
                    this.showSuccess = false
                    this.showError = true
                    this.errorMsg = error.error || 'Subscription failed, please try again later'
                    console.log('Error:', error);
                });
        }
    }
})

改完重启Django服务即可,重复提交邮箱时就会显示红色的email is already in use提示,新邮箱提交才会显示订阅成功。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:17