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

Django注册表单添加手机号字段后,手机号与OTP无法保存至数据库

排查表单提交后phoneno和otp字段未保存/显示的问题

从你描述的情况来看,只有username被正常保存,phoneno和otp既不在前端显示也没存入数据库,大概率是表单、模型或者视图环节的某个步骤没处理到位,我给你列几个最常见的排查方向和解决办法:

1. 先确认模型(models.py)是否定义了这两个字段

如果你的用户模型(或者注册对应的模型)里压根没加phoneno和otp,数据库根本没有存储它们的位置,自然不会有任何显示和保存行为。比如正确的模型定义应该是这样:

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    username = models.CharField(max_length=100, unique=True)
    phoneno = models.CharField(max_length=15, unique=True)  # 必须存在这个字段
    otp = models.CharField(max_length=6, blank=True, null=True)  # 根据需求设置可空/必填

如果之前没加这两个字段,添加后一定要执行迁移命令更新数据库:

python manage.py makemigrations
python manage.py migrate

2. 检查表单(forms.py)是否包含这两个字段

你的注册表单必须显式把phoneno和otp纳入字段列表,不然前端不会渲染它们,提交时也不会传递对应的值。
如果是用ModelForm:

from django import forms
from .models import CustomUser

class SignUpForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ['username', 'phoneno', 'otp']  # 要把两个字段加进这个列表
        # 不推荐用 '__all__' 偷懒,显式指定字段更安全

如果是手动定义的Form(非ModelForm),要手动添加这两个字段:

class SignUpForm(forms.Form):
    username = forms.CharField(max_length=100)
    phoneno = forms.CharField(max_length=15)  # 必须添加
    otp = forms.CharField(max_length=6)  # 必须添加

3. 确认视图(views.py)是否正确处理表单数据

在处理提交请求的视图里,要确保你正确获取并保存了phoneno和otp的值:
如果是函数视图:

from django.shortcuts import render, redirect
from .forms import SignUpForm

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            # 如果是ModelForm且fields包含了对应字段,直接save()就会自动保存;如果是手动处理:
            user = form.save(commit=False)
            user.phoneno = form.cleaned_data['phoneno']
            user.otp = form.cleaned_data['otp']
            user.save()
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

如果是类视图(比如CreateView),要确保表单类或视图的fields属性包含这两个字段:

from django.views.generic.edit import CreateView
from .models import CustomUser
from .forms import SignUpForm

class SignUpView(CreateView):
    model = CustomUser
    form_class = SignUpForm
    success_url = '/'
    template_name = 'signup.html'

4. 前端模板是否渲染了这两个字段

最后要检查你的注册模板(比如signup.html)里有没有渲染phoneno和otp字段:
可以用自动渲染方式:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}  <!-- 会渲染表单里的所有字段 -->
    <button type="submit">提交</button>
</form>

或者手动渲染:

<form method="post">
    {% csrf_token %}
    {{ form.username.label_tag }} {{ form.username }}
    {{ form.phoneno.label_tag }} {{ form.phoneno }}  <!-- 必须有这一行 -->
    {{ form.otp.label_tag }} {{ form.otp }}        <!-- 必须有这一行 -->
    <button type="submit">提交</button>
</form>

如果模板里只渲染了username,前端自然看不到这两个字段,提交时也不会传递对应值。

你可以按照这个顺序逐步排查,从模型到表单再到视图和模板,应该能快速定位问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:03