2017-07-19 155 views
0

我试图找到一个类似的问题,但我没有找到我想要的答案。我是新来的Django,我试图了解在Django身份验证,但我得到了这样的错误:Django登录错误,无法登录

AttributeError: 'AnonymousUser' object has no attribute '_meta' 

这里是我的代码:

views.py

def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = request.GET['username'] 
      password = request.GET['password'] 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       login(request,user) 
       return redirect('/') 
      else: 
       error = " Sorry! Username and Password didn't match, Please try again ! " 
       return render(request, 'girl/login.html',{'error':error}) 
    else: 
     form = LoginForm() 
    return render(request, 'girl/login.html', {"form":form}) 

forms.py

class LoginForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('username', 'password') 

的login.html

{% extends 'base.html' %} 

{% block content %} 
    <h1>Login</h1> 
    {% if error %} 
     {{ error }} 
    {% endif %} 
    <form method="POST"> 
     {% csrf_token %} 
     {{form.as_p}} 
     <input type="submit" value="login"> 
    </form> 
{% endblock %} 

任何帮助,将不胜感激。谢谢!

+1

我不确定你是在学习Django的内部构件,还是只是为了构建一个应用程序,但这不是*自定义登录表单的方式。您可以简单地覆盖登录模板,而不是混淆表单/视图代码。 – Selcuk

+0

请添加完整的堆栈跟踪? –

回答

3

你只需要从forms.Formforms.ModelForm继承,

class LoginForm(forms.Form): 
    username = forms.CharField() 
    password = forms.CharField(widget=forms.PasswordInput()) 

此外,在您的看法,编辑这样的事情,

def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       login(request,user) 
       return redirect('/') 
      else: 
       error = " Sorry! Username and Password didn't match, Please try again ! " 
    else: 
     form = LoginForm() 
    return render(request, 'girl/login.html', {"form":form}) 
+0

它的工作,但我得到了新的错误。错误是“ django.utils.datastructures.MultiValueDictKeyError:”'username'“” 我应该编辑我的视图? –

+0

毫米......是的。我会在一分钟内发布更正的。 – zaidfazil

+0

你已经检查过'request.method'是否是'POST',但是你正在尝试访问'request.GET'。我改变了这一点,请检查功能,如有必要,让我知道任何事情。 – zaidfazil

0

您设置的密码为普通文本。像这样尝试。

def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 

     if form.is_valid(): 

      # normalized data 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 

      user = authenticate(username=username, password=password) 
      if user is not None: 
       login(request,user) 
       return redirect('/') 
      else: 
       error = " Sorry! Username and Password didn't match, Please try again ! " 
       return render(request, 'girl/login.html',{'error':error}) 
    else: 
     form = LoginForm() 
    return render(request, 'girl/login.html', {"form":form}) 
+0

'authenticate()'方法只会在用户名和密码有效的情况下返回用户。其实'set_password()'是多余的,不必要的。 – zaidfazil

+0

但是,如果他没有用户set_password(),是不是将密码保存为正常测试? –

+0

然后,'authenticate()'方法不会返回一个用户实例。它会返回None。使用'set_password()'方法的地方肯定不在这里。它应该在哪里创建用户实例。我希望你明白我的观点。 – zaidfazil