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

Django CRUD项目:提交失败/重载后保留表单数据的实现方案

解决Django添加成员时重复邮箱保留表单数据的问题

问题原因

当前代码在检测到邮箱已注册时,仅返回错误消息但未将用户提交的表单数据传递到模板,导致页面刷新后表单清空。同时模板中表单控件未正确绑定提交过的数据,无法回显用户输入。

解决方案

1. 修改添加成员的视图函数(view.py)

当邮箱重复时,将POST提交的所有数据传入模板上下文,让模板可以回显这些数据:

@login_required
def user_data_create(request):    
    if request.method == 'POST':
        name = request.POST['name']
        email = request.POST['email']
        phone = request.POST['phone']
        gender = request.POST.get('gender', '')  # 用get避免键不存在报错
        role = request.POST.get('role', 'Traniee')
        if Members.objects.filter(email=email).exists():
            messages.error(request,"该邮箱已注册")
            # 将提交的数据打包传入模板
            form_data = {
                'name': name,
                'email': email,
                'phone': phone,
                'gender': gender,
                'role': role
            }
            # 传递form_data到模板
            return render(request, 'add.html', {'form_data': form_data})
        else:    
            user_data = Members.objects.create(user=request.user, name=name, email=email, 
                                                phone=phone, gender=gender,role=role)
            messages.success(request,"新成员添加成功")
            return redirect('dashboard_page')
    # GET请求时初始化空的form_data,避免模板报错
    return render(request, 'add.html', {'form_data': {}})

2. 修改添加页面模板(add.html)

更新表单控件,绑定form_data中的数据,实现回显:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>添加成员</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
        crossorigin="anonymous"></script>
</head>
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">

<body>
    <div>
        {%if messages%}
        {% for message in messages%}
        <div id="message_container" class="alert alert-warning alert-dismissible fade show text-center" role="alert">
            {{message}}
            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>
        {%endfor%}
        {%endif%}
    </div>

    <div class="container1">
        <h1>添加成员</h1>
        <form action="{% url 'user_data_create' %}" method="post">
            {% csrf_token %}
            <label for="">姓名</label><br><br>
            <input type="text" name="name" value="{{ form_data.name|default:'' }}" pattern="^[^ ].+[^ ]$" title="请移除多余空格" required><br><br>
            
            <label for="">邮箱</label><br><br>
            <input type="email" name="email" value="{{ form_data.email|default:'' }}" required><br><br>

            <label for="">联系方式</label><br><br>
            <input type="text" name="phone" value="{{ form_data.phone|default:'' }}" title="请输入10位数字" maxlength="10" minlength="10"
            pattern="\d{10}" required><br><br>

            <p>请选择性别:</p>
            <input type="radio" name="gender" value="Male" {% if form_data.gender == 'Male' %}checked{% endif %}>
            <label for="male">男</label><br>
            <input type="radio" name="gender" value="Female" {% if form_data.gender == 'Female' %}checked{% endif %}>
            <label for="female">女</label><br>
            <input type="radio" name="gender" value="Other" {% if form_data.gender == 'Other' %}checked{% endif %}>
            <label for="other">其他</label>

            <br><br>
            <label for="role">选择身份:</label>
            <select name="role" id="role">
              <option value="None" {% if form_data.role == 'None' %}selected{% endif %}>无</option>  
              <option value="FM" {% if form_data.role == 'FM' %}selected{% endif %}>FM</option>
              <option value="TM" {% if form_data.role == 'TM' %}selected{% endif %}>TM</option>
              <option value="TL" {% if form_data.role == 'TL' %}selected{% endif %}>TL</option>
              <option value="Traniee" {% if form_data.role == 'Traniee' or not form_data.role %}selected{% endif %}>实习生</option>
            </select>   <br><br>
            
            <a class="button2" href="{% url 'dashboard_page' %}">
                <button type="button" class="btn btn-danger" id="ID">取消</button>
            </a>
            <button type="submit" class="btn btn-success" id="ID">提交</button>
        </form>
    </div>
</body>
</html>

关键说明

  • 视图中通过form_data字典存储用户提交的所有数据,在邮箱重复时传递给模板,确保数据回显。
  • 模板中使用{{ form_data.field|default:'' }}处理初始加载时的空值,避免报错。
  • 单选按钮和下拉框通过{% if %}判断选中状态,确保用户之前的选择被保留。
  • 修正了原模板中未闭合的HTML标签,移除了多余的格式标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:40:00