正确的用户名密码不登录django

时间:2017-01-06 22:56:40

标签: python django authentication login

我正在使用django开发一个小型网站,我正在使用内置的登录视图。当我注册一个标准用户,然后尝试使用正确的凭据登录时,它会向我显示登录错误“请输入正确的用户名和密码”。我创建的超级用户不会出现此问题。可以使用正确的凭据登录,而不显示任何错误消息。

这是views.py和我的注册视图。

from django.shortcuts import redirect, render, get_object_or_404
from django.contrib.auth.models import User
from .forms import UserForm

def register_user(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save()
            return redirect('user_profile', pk=user.pk)
    else:
        form = UserForm()
    return render(request, 'interport/register_user.html', {'form':form})

admin.py:

from django.contrib import admin
from django.contrib.auth.models import User

forms.py:

from django import forms
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    class Meta:
    model = User
    fields = ('first_name', 'last_name', 'email', 'username', 'password',)

urls.py:

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    url(r'^accounts/login/$', auth_views.login, name='login'),
    url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),
    url(r'^register_user$', views.register_user, name='register_user'),
    url(r'^$', views.home, name='home'),
]

登录模板:

{% extends "interport/base.html" %}
{% block content %}
<div class="container">
  <div class="row">
    <div class="center col s4 offset-s4 card-panel #fff8e1 amber lighten-5">
<h2>Login</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Login</button>
</form>
    </div>
  </div>
</div>
{% endblock %}

2 个答案:

答案 0 :(得分:2)

您使用纯文本密码保存新用户,但Django将始终在检查有效性之前对密码进行哈希处理。

您需要通过User.objects.create_user()创建用户,这样可以正确记录密码,或者在创建后使用user.set_password()设置哈希密码。

答案 1 :(得分:0)

可接受的答案是好的,而且还是古老的,但是我建议将这些说明放在所述表格的save函数中。 这样,您可以在视图中使用更清晰的代码,并且在更改表单处理方式时可以更轻松地进行维护。您不必回到使用该表单的views.py中的每个函数。

在OP的情况下,表单如下所示:

from django import forms
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    class Meta:
    model = User
    fields = ('first_name', 'last_name', 'email', 'username', 'password',)

    def save(self, commit=False):
        instance = super(UserForm, self).save(commit=False) # create but don't save yet
        if commit:
            instance.set_password(instance.password)
            instance.save()
        return instance

也许会有更优雅的方法,但是它一直在为我工作。

具有有关commit = False的解释:Django ModelForm: What is save(commit=False) used for?