Django搭建注册表单触发NoReverseMatch报错该如何解决?
1. 直接触发NoReverseMatch报错的根因
你在urls.py中给register路由配置了多余的<int:register>参数,但是register视图不需要接收该参数,且模板中调用{% url 'register' %}时也没有传参,因此匹配失败。
修复方法:修改urls.py的路由为无参数格式:
path("register/", views.register, name='register'),
2. views.py存在的多个逻辑错误
- 缩进逻辑错误:当前
else分支挂载在if user_form.is_valid()下,GET请求不会触发表单初始化逻辑 - 密码设置错误:
set_password是方法不是属性,且字段名拼写错误
修复后代码:
def register(request): if request.method == "POST": user_form = UserRegistrationForm(request.POST) if user_form.is_valid(): new_user = user_form.save(commit=False) new_user.set_password(user_form.cleaned_data['password']) new_user.save() return render(request, 'main/account/register_done.html', {'new_user': new_user}) else: user_form = UserRegistrationForm() return render(request, "main/account/register.html", {'user_form': user_form})
3. forms.py存在的多个错误
Meta类缩进错误:当前和UserRegistrationForm平级,需要缩进为表单类的内部类- 字段名错误:Django内置
User模型没有Username、Name、SurName字段,默认对应字段为username、first_name、last_name - 密码校验逻辑错误:对比密码时取值写法错误
修复后代码:
from django.contrib.auth.models import User from django import forms class UserRegistrationForm(forms.ModelForm): password = forms.CharField(label='Password', widget=forms.PasswordInput) password2 = forms.CharField(label='Repeat password', widget=forms.PasswordInput) class Meta: model = User fields = ("username", "email", "first_name", "last_name") def clean_password2(self): cd = self.cleaned_data if cd['password'] != cd['password2']: raise forms.ValidationError("Password dont match") return cd["password2"]
4. base.html的冗余属性
a标签不需要加method="POST"属性,该属性仅适用于表单标签,直接删除即可:
<a class="me-3 py-2 text-dark text-decoration-none" href="{% url 'register' %}">Регистрация</a>
内容的提问来源于stack exchange,提问作者MihailCapone
相关产品推荐
相关产品推荐

