使用django的用户身份验证模型的问题。难以理解的错误

时间:2011-09-27 23:19:41

标签: django authentication model modelform

我想注册用户。 所以我做了一个:

class RegisterForm(ModelForm):
    class Meta:
        model=User #(from django.auth.contrib.User)

现在我在模板中显示该表单,供用户填写并提交。 当我执行form.is_valid()时,我收到此验证错误:Your username and password didn't match. Please try again.

有谁知道是什么原因引起的? 我已经包含ModelForm,处理注册表单的视图和显示注册表单的模板。 感谢您的时间和关心。

MY MODEL FORM
class RegisterForm(ModelForm):
    class Meta:
        model=User

THE VIEW THAT HANDLES THE REGISTRATION
def register(request):
    if request.method=='POST':
        form=RegisterForm(request.POST)
        if form.is_valid(): # HERE I GET A VALIDATION ERROR
            new_user=User.objects.create_user(username=form.cleaned_data['username'],
                                          password=form.cleaned_data['password'],
                                          email=form.cleaned_data['email'],
                                          )
            new_user.is_active=True
            new_user.first_name=form.cleaned_data['first_name']
            new_user.last_name=form.cleaned_data['lastname']
            return HttpResponseRedirect(reverse('confirm_registered'),args=[form.cleaned_data['username']])
        else:
            return render(request,'login/register.html',{'form':form})
    else:
        raise ValueError()

注册模板

{% extends "store/index2.html" %}

{% block canvas %}
<h3>Registration</h3>


{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

<form method="post" action="/retailstore/login/register.html">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
</tr>
<tr>
    <td>{{ form.first_name.label_tag }}</td>
    <td>{{ form.first_name }}</td>
</tr>
<tr>
    <td>{{ form.last_name.label_tag }}</td>
    <td>{{ form.last_name }}</td>
</tr>
<tr>
    <td>{{ form.email.label_tag }}</td>
    <td>{{ form.email }}</td>
</tr>

</table>

<input type="submit" value="register" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}

2 个答案:

答案 0 :(得分:1)

表单未验证,但您的模板设置为始终显示有关用户名和密码不匹配的相同错误消息:

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

它未验证的原因可能是因为您只使用了User对象中的某些字段,而ModelForm期望所有的不可编辑字段。在Form的Meta中,设置

 fields = 'username', 'password', 'first_name', 'last_name', 'email'

告诉它只需要那些字段。

另请注意,密码不会以纯文本形式存储在数据库中,因此使用类似密码创建用户将无效。您需要使用user.set_password(form_password)

答案 1 :(得分:0)

正如Dave指出的那样,无论验证错误是什么,您都会显示相同的消息。你应该这样做:

{% if form.errors %}
    {{ form.errors }}
{% endif %}