2016-03-03 200 views
7

我有一個自定義Django登錄頁面。我想在用戶名或密碼字段爲空時拋出異常。我怎樣才能做到這一點?Django自定義登錄頁面

我view.py登錄方法:

def user_login(request): 
    context = RequestContext(request) 
    if request.method == 'POST': 
     # Gather the username and password provided by the user. 
     # This information is obtained from the login form. 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     print("auth",str(authenticate(username=username, password=password))) 

     if user: 
      # Is the account active? It could have been disabled. 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/') 
     else: 
      return HttpResponse("xxx.") 
    else: 
     # Bad login details were provided. So we can't log the user in. 
     print ("Invalid login details: {0}, {1}".format(username, password)) 
     return HttpResponse("Invalid login details supplied.") 
    else: 
     return render_to_response('user/profile.html', {}, context) 

我嘗試這樣做,也沒有工作: 這是forms.py

def clean_username(self): 
    username = self.cleaned_data.get('username') 
    if not username: 
     raise forms.ValidationError('username does not exist.') 
+2

可否請您更新正確的縮進 – Sayse

+1

問題只是定義'clean_username(個體經營):如果沒有self.cleaned_data [ '用戶名']:ValidationError( '')在相應的表格'方法。 –

+0

嗨,我把它只是爲了測試,xxx是一個HTML網站。 – chazefate

回答

6

您可以使用由Django提供的登錄視圖。所以你的login.html應該看起來就像那個例子。

<form class="login" method="POST" action="/login/"> 

    {% csrf_token %} 

    {{form.as_p}} 

    <li><input type="submit" class="logBut" value="Log in"/></li> 
    </form> 

並記住urls.py!

url(r'^login/$','django.contrib.auth.views.login', {'template_name': '/login.html'}), 
+0

偉大的工作原理。謝謝你。 – chazefate

+0

我沒有form.as_p。 – chazefate

4

正確的做法是用forms,而不是直接從request.POST獲取變量。然後,Django將驗證表單數據,並在表單呈現在模板中時顯示錯誤。如果需要表單字段,那麼Django會在字段爲空時自動顯示錯誤,您甚至不需要爲此寫入clean_<field_name>方法。

Django已經有built in login view。最簡單的方法是使用這個,而不是寫你自己的。如果你仍然想寫自己的觀點,你仍然會發現看看Django是如何做到這一點很有用的。

+1

我不明白爲什麼每個人都想使用內置的登錄視圖這麼多?對不起,重振舊線程,但是有一種簡單的方法,我錯過了如何改變這種觀點?如在中,添加類到輸入元素和其他屬性? – Zeretil

+0

你說*我不明白爲什麼每個人都想使用內置的登錄視圖這麼多*。我用另一種方式來看待它 - 我不明白爲什麼你會想要寫出你自己的視圖,當Django中包含經過良好測試和廣泛使用的視圖時,它可能會出現錯誤或者更嚴重的安全漏洞。 – Alasdair

+0

@Zeretil我不能幫助添加類輸入元素,這是這個問題的主題。我猜這個問題已經在Stack Overflow的其他地方得到了回答,如果你找不到它,那麼最好是開始一個新問題,而不是在評論中提問。 – Alasdair