2017-08-24 86 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

補充說,第nth發生了。 –

+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男人很好的指導。 –