2016-02-11 100 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