2016-02-11 120 views
0

我创建了一个用户登录页面,它工作的很棒!但是当用户输入错误的凭证时,如何在登录页面上显示错误?我尝试了一个if和一个变量,但是不管怎么样都导致了错误的显示。在登录表单中显示错误

在我的意见,我已经设置了“ERROR_MESSAGE”变量,像这样:

def LoginView(request): 
    error_message = '' 
    logout(request) 
    context = RequestContext(request) 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/") 
     else: 
      # Return a 'disabled account' error message 
      return HttpResponseRedirect("/") 
    else: 
     # Return an 'invalid login' error message 
    ---> error_message = "Incorrect username or password." 
    return render(request, 'profile/login.html', {'error_message': error_message}, context) 

然而,在我的模板,这个变量将显示不管是什么,即使我设置里面的变量“如果“声明。

这里是我的模板:

{% include '__header.html' %} 
<style> 
main { 
    width: 920px; 
    background: none; 
    margin-top: calc(50vh - 280px) 
} 
</style> 

<div class="form-container"> 
<form id="user" method="post" action="/login/" 
enctype="multipart/form-data" class="text"> 
    {% csrf_token %} 
    <div class="title">Login to your account</div> 
    <div class="form-col"> 
     <div class="field-container"> 
      <div class="field-input-container"> 
       <div class="field-label">Username</div> 
       <div class="field-input"> 
        <input class="field-input-element" type="text" name="username"/> 
       </div> 
      </div> 
     <div class="field-help"></div> 
     </div> 
    </div> 
    <div class="form-col"> 
     <div class="field-container" style="height: 110px"> 
      <div class="field-input-container"> 
       <div class="field-label">Password</div> 
       <div class="field-input"> 
       <input class="field-input-element" type="password" name="password"/> 
       </div> 
      </div> 
     <div class="field-error">{{ error_message }}</div> 
     <div class="field-help"></div> 
     </div> 
    </div> 
    <div class="form-button-container"> 
    <input type="submit" name="submit" value="Login" class="button form-button"/> 
    </div> 
</form> 
</div> 

{% include '__footer.html' %} 

那么,怎样才能在我只有在出现了一个错误的模板显示错误信息?基于


更新代码关闭答案(仍然没有同样的事情)

def LoginView(request): 
    template_name='profile/login.html' 
    logout(request) 
    context = RequestContext(request) 

    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect("/") 
      else: 
       # Return a 'disabled account' error message 
       return HttpResponseRedirect("/") 
     else: 
      # Return an 'invalid login' error message 
      error_message = "Incorrect username or password." 
    else: 
     error_message = '' 

    return render(request, 'profile/login.html', {'error_message': error_message}, context) 
+1

为什么不使用[登录视图](https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.views.login)? – Sayse

+0

我想要更多地控制视图的实际功能,而且这个功能完美。当这个工作正常的时候,我不会试着去做其他事情。 –

+1

为什么它的价值,真的没有太多的需要做的使用Django之一,我提供的链接甚至给你一个示例模板 – Sayse

回答

2

,你必须检查他们是否已经张贴的形式,所以你可以在if request.method == 'POST'

if request.method == 'POST': 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/") 
     else: 
      # Return a 'disabled account' error message 
      return HttpResponseRedirect("/") 
    else: 
     # Return an 'invalid login' error message 
     error_message = "Incorrect username or password." 

您可能还需要包装包装这部分细节只应用户的逻辑在

{% if error_message %} 
+0

这是做同样的事情。 –

+0

@SebastianOlsen - 你能否更新你当前的问题还包括你已经更新的内容?我看不到它怎么可能 – Sayse

+0

http://pastebin.com/X86z4mGX –

1

立即解决问题是你设置你的错误消息GET和POST请求。用户提交数据后,您应该只显示POST请求。

if request.method == "POST": 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     ... 
    else: 
     # Return an 'invalid login' error message 
     error_message = "Incorrect username or password." 
0

这里你的错误的div可能是你,第一进口和您的视图内声明的模板名称有用的例子:

from django.contrib import messages 

template_name='your_app/login.html' #Inside the login view 

接着,在登录失败:

messages.error(request, "incorrect user or password") 

而在去年,呈现模板:

return render(request, self.template_name,{"form_group" : form_group}) 

希望它能帮助。

+0

“自我”没有定义。另外,我想补充一点,我没有使用表单,我只是从HTML表单获取信息,然后使用正确的字段将其发布到服务器。 –

+0

我明白了,Self会是您放置登录代码的视图,render中的表单代码仅仅是一个参数,为了防止您使用表单或者yopu想要将错误的值返回给用户 – jsanchezs

+0

@jsanchezs - 即使函数名称是LoginView,它仍然是一个基于函数的视图,而不是基于类的视图,这是您的答案设计的 – Sayse