根据给出的代码,我发现可能有两个问题:
确认两次输入密码一致的验证逻辑不应该放在 clean() 方法中,而是应该放在 clean_passwords() 方法中。这样可以确保只针对密码字段进行验证。
在模板中的 for 循环语句中,form 并不是一个列表(即可迭代对象),而是表单类实例化后得到的一个具体表单对象。所以将 {% for form in form %} 改为 {% for field in form %},然后在表单字段上调用相应的属性和方法。例如,{{ field.label_tag }} 和 {{ field }} 可以分别显示表单字段的标签和部件,{{ field.errors }} 显示表单字段的错误信息。
修改后的代码如下:
from django import forms
from django.core.exceptions import ValidationError
from . import models
class AdminUserForm(forms.ModelForm):
password_confirmation = forms.CharField(
label="确认密码",
widget=forms.PasswordInput(),
)
class Meta:
model = models.Admin
fields = ["username", "password"]
widgets = {"password": forms.PasswordInput(),}
def clean_password_confirmation(self):
password = self.cleaned_data.get("password")
password_confirmation = self.cleaned_data.get("password_confirmation")
if password and password_confirmation and password != password_confirmation:
raise ValidationError("两次输入的密码不一致")
return password_confirmation
def admin_user_add(request):
if request.method == "GET":
form = AdminUserForm()
return render(request, "admin_user_add.html", {"form": form})
form = AdminUserForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('/admin_view/')
else:
return render(request, "admin_user_add.html", {"form": form})
模板文件也需要对应地修改为:
{% extends 'root_yongh.html' %}
{% block b %}
<body>
<form method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
{{ field.label_tag }} : {{ field }}
<span style="color: red">{{ field.errors }}</span>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary">提交</button>
<input type="reset" name="reset" id="reset" value="重置">
</form>
</body>
{% endblock %}
在这个修改后的代码中,clean_password_confirmation() 方法专门负责验证两次输入的密码是否一致,并抛出 ValidationError 异常,然后在 AdminUserForm 类的 Meta 类中只设置了 "username" 和 "password" 两个字段,这样在视图函数中获取的表单数据就只包括这两个字段。同时,模板中的 for 循环语句中使用了 field 替换了原来的 form 对象名。
希望能对你有所帮助! |