2016-08-13 46 views
0

這將是有人在那裏一個簡單的問題。我搜索了很多,如果有線程可以很好地解決這個問題,請指導我並關閉它。我正在使用Django在我們組織的網站中構建一個非常簡單的Web表單。如何從Django登錄表單傳遞用戶名?

在forms.py我已經得到了登錄頁面類:

class userLogin(forms.Form): 

    user = forms.CharField(label = 'Username ', max_length = 25) 
    pwd = forms.CharField(label = 'Password ', widget = forms.PasswordInput) 

    def clean(self): 

     cleaned_data = super(userLogin, self).clean() 
     user   = cleaned_data.get("user") 
     pwd   = cleaned_data.get("pwd") 

     if not fs.authenticateUser(user, pwd): 
      raise forms.ValidationError("Invalid password!") 

我必須對我們網站的API,這是fs.authenticate位是什麼身份驗證;它只是返回True或False。在views.py我這樣做:

if request.method == 'POST': 

     user_form = userLogin(data = request.POST) 

     if user_form.is_valid():    
      return redirect('PickupAuthorization/main') 
     else: 
      pass      

認證和重定向到主頁工作出色,當憑證是不正確的預期登錄表單拋出一個無效的密碼信息。我想知道的是如何讓「user」可用於views.py。如果我試圖在視圖中引用user_form.user,Python告訴我用戶不是userLogin的屬性!

我沒有做太多與OOP,所以我想象這有一個簡單的答案,但我不能刻着找到它。謝謝!

編輯:我不得不擱置這一項目有利於更緊迫的事情的那一刻,但我會更新它,當我有正常工作的解決方案。

+3

你不需要重新發明輪子,看看https://docs.djangoproject.com/en/1.10/topics/auth/customizing/ – Wtower

+0

我看了看這個,我明白了它談論AUTHENTICATION_BACKENDS設置。但後來它討論了編寫我自己的身份驗證後端,我_think_是我需要做的,因爲我使用的是第三方API。然而,我不清楚如何返回一個用戶對象。如果我正確地閱讀了https://docs.djangoproject.com/en/1.10/topics/auth/default/#user-objects文檔,我需要做一些類似'from django.contrib.auth。模型導入User',然後'user = User.objects.create_user' - 使用經過驗證的用戶名,是嗎? –

回答

1

您需要使用Django爲了得到用戶提供authenticate方法。 authenticate方法返回一個用戶,如果它找到一個。使用authenticate()。它有兩個關鍵字參數,usernamepassword,並返回一個User object如果password是有效的給定username。如果password是無效的,authenticate()回報None

一般採用authenticate流程是這樣的:

forms.py

class userLogin(forms.Form): 

    user = forms.CharField(label = 'Username ', max_length = 25) 
    pwd = forms.CharField(label = 'Password ', widget = forms.PasswordInput) 

    def __init__(self, *args, **kwargs): 
     self.user_cache = None # You need to make the user as None initially 
     super(LoginForm, self).__init__(*args, **kwargs) 

    def clean(self): 

     cleaned_data = super(userLogin, self).clean() 
     user   = cleaned_data.get("user") 
     pwd   = cleaned_data.get("pwd") 

     # Now you get the user 
     self.user_cache = authenticate(username=user, password=pwd) 
     # Do other stuff 
     return self.cleaned_data 

    # Function to return user in views 
    def get_user(self): 
     return self.user_cache   

Views.py

if request.method == 'POST': 
    user_form = userLogin(data = request.POST) 
    # You can now get user using the get_user method 
    user = user_form.get_user() 

    # Do other stuff 

我想要的另一件事補充說明的是,如果你的用戶已經登錄,你可以簡單地做request.user.usernameviews.py來獲得當前用戶。

+0

好吧,我明白你在說什麼......但正如我在上面對@Wtower的迴應中提到的,似乎我需要編寫自己的身份驗證後端,因爲我通過我們網站的API進行身份驗證。然後,我將後端添加到settings.py中的AUTHENTICATION_BACKENDS中,當我進行調用'self.user_cache = authenticate(username = user,password = pwd)'時,Django會反過來使用它,是嗎? –

+0

我遵循你的結構,它認證的很好,但在view.py中,當我去'用戶= user_form.get_user()',然後嘗試打印'user.usernames',我得到的用戶名不是用戶的屬性。但是文檔清楚地表明用戶名是用戶對象的一個​​屬性。我不瞭解什麼? –

+0

@PatJones打印'user'並讓我知道它打印的內容。你也有一個用戶模型?因此請添加上面的代碼。 – Aakash

相關問題