2016-08-13 1 views
0

これは誰かにとって簡単な質問です。私はかなりの周りを検索し、これを完全に解決するスレッドがある場合は、私に指示してこれを閉じてください。私は、Djangoを使用して、私たちの組織のウェブサイト内に非常に単純なWebフォームを構築しています。 forms.pyでは、私は、ログインページのためのクラスをDjangoログインフォームからユーザー名を渡すには?

を持っている:

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!") 

私はfs.authenticateビットがあるものについてである私達のウェブサイトのAPI、に対して認証する必要があります。 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      

メインページへの認証とリダイレクトが見事に機能し、ログインフォームは、クレデンシャルが正しくないと、期待どおり無効なパスワードメッセージをスローします。私が知りたいのは、 "users"をviews.pyで利用できるようにする方法です。ビューでuser_form.userを参照しようとすると、userはuserLoginの属性ではないことがPythonから通知されます。

私はOOPであまり仕事をしていないので、これは簡単な答えがあると思いますが、私はそれを見つけることができません。ありがとう!

編集:私は、このプロジェクトをすぐに棚上げしなければなりませんでしたが、もっと重要なことに賛成する必要がありましたが、適切に機能するソリューションがあればそれを更新します。

+3

ホイールを再発明する必要はありません。https://docs.djangoproject.com/en/1.10/topics/auth/customizing/ – Wtower

+0

私はこれを見て、私はそれを理解します。ここでAUTHENTICATION_BACKENDSの設定について説明します。しかし、それは私がサードパーティのAPIを使用しているので、私は自分の認証バックエンドを書くことについて議論しています。しかし、私はUserオブジェクトを返す方法については不明です。私がhttps://docs.djangoproject.com/en/1.10/topics/auth/default/#user-objectsの文書を正しく読んでいるなら、 'django.contrib.authからのようなものをする必要があります。モデルをインポートするUser'、次に 'user = User.objects.create_user' - 認証されたユーザ名を利用する、そう? –

答えて

1

Djangoで提供されるauthenticateメソッドを使用する必要があります。 authenticateメソッドは、見つかった場合にユーザーを返します。
usernameおよびpasswordには、authenticate()を使用してください。 usernamepasswordの2つのキーワード引数をとり、usernameに対してpasswordが有効な場合はUser objectを返します。 passwordは、authenticate()戻りNone無効な場合:

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 

一般authenticateを使用して、フローは次のようになります

もう1つ好きなことあなたのユーザーが既にログインしている場合は、views.pyrequest.user.usernameを入力して現在のユーザーを取得することができます。

+0

さて、あなたが言っていることを理解しています...上記の@Wtowerへの私の回答で言及したように、私は自分の認証バックエンドを書く必要があるようです。私はバックエンドをsettings.pyのAUTHENTICATION_BACKENDSに追加し、Djangoは 'self.user_cache = authenticate(username = user、password = pwd)'という呼び出しを行うときにそれを使用します。 –

+0

あなたの構造に従っていますが、それはうまく認証されますが、 'users = user_form.get_user()'に行き、 'user.usernames'を出力しようとするとviews.pyで、そのユーザー名はuserの属性ではありません。しかし、ドキュメンテーションは、usernameがUserオブジェクトの属性であることを明確に述べています。私は何を理解していないのですか? –

+0

@PatJonesは 'user'を出力し、それが何を出力するかを教えてください。また、ユーザーモデルもありますか?上記のコードを追加してください。 – Aakash

関連する問題