如何不使用Django Forms实现自定义用户注册表单并入库
解决HTML注册表单数据存入Django数据库的问题
问题核心
当前无法保存数据的原因集中在三点:
SignupForm未覆盖前端提交的密码、地址等字段,也没处理密码加密逻辑- 缺少专门处理注册请求的
signup视图函数 - HTML表单中地址字段名
adress与User模型的address不匹配
分步解决代码
1. 完善注册表单(forms.py)
更新表单,添加密码确认校验,并重写保存逻辑加密密码:
from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.hashers import make_password class LoginForm(forms.Form): email = forms.EmailField(max_length=50) password = forms.CharField( max_length=50, label="mot de passe ", widget=forms.PasswordInput) class SignupForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput, label="Mot de passe") password2 = forms.CharField(widget=forms.PasswordInput, label="Confirmer le Mot de passe") class Meta: model = get_user_model() fields = ('username', 'email', 'phone', 'country', 'address') def clean_password2(self): # 校验两次密码一致性 password = self.cleaned_data.get('password') password2 = self.cleaned_data.get('password2') if password and password2 and password != password2: raise forms.ValidationError("Les mots de passe ne correspondent pas") return password2 def save(self, commit=True): # 创建用户并加密密码 user = super().save(commit=False) user.password = make_password(self.cleaned_data['password']) if commit: user.save() return user
2. 添加注册视图函数(views.py)
在views文件中新增处理注册请求的逻辑:
from django.shortcuts import render, redirect from user.forms import SignupForm from django.contrib.auth import login def signup(request): if request.method == 'POST': form = SignupForm(request.POST) if form.is_valid(): user = form.save() # 注册完成自动登录(可选) login(request, user) return redirect('account') # 跳转到用户账户页 else: form = SignupForm() return render(request, 'user/signup.html', {'form': form})
3. 修正HTML表单字段名
将地址字段的name="adress"改为name="address",与模型字段对齐:
<div class="form-group"> <label>Adresse</label> <input name="address" type="text" class="form-control" value=""> </div>
4. 验证URL配置
你的urls.py已配置path('signup/', views.signup, name='signup'),无需修改,确保前端表单提交路径正确即可。
验证步骤
- 访问
/signup/页面填写所有字段 - 提交表单后检查数据库是否新增用户记录
- 测试新用户是否能正常登录
内容的提问来源于stack exchange,提问作者Roy Akany
相关产品推荐
相关产品推荐

