我正在使用内置的User模型和UserCreationForm设置用户注册。问题在于,如果提供适当的凭据,表单验证将失败。我不明白为什么?
由于某种原因, form.cleaned_data 似乎缺少“ password2”。但是 form.data 有它。
POST的内容等于 form.data 。
开机自检
csrfmiddlewaretoken: 1EA7k5HUM7aDO1qj9DPslM18rz2QATZh0qtRd1R8iHc9MmnBgLGyUsO3YJzQjNwA
username: test
password1: qwe
password2: qwe
我在django == 2.1的其他项目中有相同的代码,没有问题。
views.py
from django.contrib.auth.forms import UserCreationForm
from django.http import JsonResponse
def register_user(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
return JsonResponse({'username': username, 'password': password})
else:
return JsonResponse({
'error': 'Form not valid',
'messages': form.error_messages,
'cleaned_data': form.cleaned_data,
'data': form.data,
})
else:
form = UserCreationForm()
return render(request, 'register_form.html', {'form': form.as_p()})
模板:
{% block content %}
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit" name="" value="Submit">
</form>
{% endblock %}
预期:
{'username': 'test', 'password': 'qwe'}
实际:
{"error": "Form not valid",
"messages": {"password_mismatch": "The two password fields didn't match."},
"cleaned_data": {"username": "test",
"password1": "qwe"},
"data": {"csrfmiddlewaretoken": "long string:)",
"username": "test",
"password1": "qwe",
"password2": "qwe"}}
答案 0 :(得分:0)
有关表单错误的信息可以在 form.errors 中找到。 似乎误导的form.error_messages字段仅用作存储文本的常量。不过,它的名字不应该全部大写吗?
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and
password.
"""
error_messages = {
'password_mismatch': _("The two password fields didn't match."),
}
答案 1 :(得分:0)
我的问题是密码太短。
UserCreationForm({'username': 'username', 'password1': 'pwd', 'password2': 'pwd'}).error_messages
结果为{'password_mismatch': 'The two password fields didn’t match.'}
。但是:
UserCreationForm({'username': 'username', 'password1': 'lalalalapwd', 'password2': 'lalalalapwd'}).is_valid()
结果为True
答案 2 :(得分:0)
确保您遵守规则
您的密码不能与您的其他个人信息太相似。
您的密码必须至少包含8个字符。
您的密码不能是常用密码。
您的密码不能全是数字。
就我的情况而言,我总是跳过第一条规则。希望它对某人有帮助。