2017-08-24 10 views
2

動作しない、問題は、それが動作しないです:Dログインはので、私はフォームでログインページを作ってるんだ

これは私のフォームです

forms.py

from django.contrib.auth.models import User 
from django import forms 

class UserForm(forms.ModelForm): 

    password = forms.CharField(widget=forms.PasswordInput) 
     class Meta: 

    model = User 
    fields = ['username', 'password',] 

私のviews.py

def user_login(request): 

    if request.method == 'POST': 
     login_form = UserForm(request.POST) 
     if login_form.is_valid(): 
      username = login_form.cleaned_data.get('username') 
      raw_password = login_form.cleaned_data.get('password') 
      user = authenticate(username=username, password=raw_password) 
      login(request, user) 
      return redirect('restricted') 
    else: 
     login_form = UserForm() 
return render(request, 'userlogin.html', {'login_form': login_form}) 

と私のhtml

<h2>Login</h2> 
    <form method="post"> 
    {% csrf_token %} 
    {{ login_form.username }} 
     <br> 
     {{ login_form.password }} 
     <br> 
    <button type="submit">Login</button> 
    </form> 

制限があるのは、どのユーザーがログインしているかを確認するhtmlです。 なぜそれが動作していないのか分かりません。私をリダイレクトする代わりにloginuser.htmlページにリダイレクトしています。ユーザーがログインしている場合にのみ表示されます制限ページ

+1

「うまくいかない」という意味を定義してください。エラースタックトレースを追加します。 – wencakisa

+0

エラーはありません。認証できません。 –

+0

'POST'アクションの後にリダイレクトされましたか?あなたにhtmlテンプレートを教えてください –

答えて

0

テンプレートにフォームエラーのブロックを追加する

<h2>Login</h2> 
    <form method="post"> 
<!-- form errors --> 
{% if login_form.errors %} 
    {% for field in login_form %} 
     {% for error in field.errors %} 
       <strong>{{ error|escape }}</strong> 
     {% endfor %} 
    {% endfor %} 
    {% for error in login_form.non_field_errors %} 
      <strong>{{ error|escape }}</strong> 
    {% endfor %} 
{% endif %} 
<!-- form errors --> 
    {% csrf_token %} 
    {{ login_form.username }} 
     <br> 
     {{ login_form.password }} 
     <br> 
    <button type="submit">Login</button> 
    </form> 
+0

がこれを追加しました。 –

+0

ssory、私はテンプレートのデフォルトフォームを使用しますが、 'login_form'を使用して、新しいバージョン –

+0

を試して修正しました。"そのユーザー名を持つユーザーは既に存在します。それは私が推測するエラーです。なぜ私はこれを得るべきですか?私は新しいユーザーを作っていません –

2

あなたはより多くの詳細を追加する必要がありますが、ここでは、ユーザーにログインするステップバイステップガイドです。

forms.py

from django.contrib.auth import authenticate, get_user_model 


User = get_user_model() 

class LoginForm(forms.Form): 
    username = forms.CharField() 
    password = forms.CharField() 

def clean(self, *args, **kwargs): 
    username = self.cleaned_data.get("username") 
    password = self.cleaned_data.get("password") 
    user_obj = User.objects.filter(username=username).first() 
    if not user_obj: 
     raise forms.ValidationError("Invalid credentials") 
    else: 
     if not user_obj.check_password(password): 
      raise forms.ValidationError("Invalid credentials") 
    return super(LoginForm, self).clean(*args, **kwargs) 

とあなたでviews.py

from django.contrib.auth import login 
from .forms import LoginForm # or where you have the LoginForm 

User = get_user_model() 

def user_login(request): 
    form = LoginForm(request.POST or None) 
     if not request.user.is_authenticated: 
      if form.is_valid(): 
       username_ = form.cleaned_data.get('username') 
       user_obj = User.objects.get(username__iexact=username_) 
       login(request, user_obj) 
       return #something 
      else: 
       # show an error or etc 
       ... 
     else: 
      # user is authenticated before and he is in. 
      ... 

とあなたのtemplate.html

<form action="" method="post"> 
{% csrf_token %} 
    <input type="text" name="username"> 
    <hr> 
    <input type="password" name="password"> 
    <hr> 
    <button type="submit">Login</button> 
</form> 

注: フォームをレンダリングするためのDjangoを使用することができますが、あなたは(PasswordInputウィジェットを追加する)、パスワードなどのフォームフィールドにいくつかの変更を加える必要があります

+0

tnx man rly良いガイド。 –

関連する問題