2013-02-26 46 views
14

tôi làm mẫu đăng nhập/mật khẩu:Django. Thông báo lỗi cho mẫu đăng nhập

mô hình:

class LoginForm(forms.Form): 
username = forms.CharField(max_length=100) 
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100) 

xem:

def login_view(request): 
    if request.method == 'POST': 
     username = request.POST['email'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None and user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
     return HttpResponseRedirect("/login") 
    form=LoginForm() 
    return render(request, 'enter.html', {'login_form': LoginForm}) 

url:

(r'^login/$', login_view), 

mẫu:

{% if form.errors %} 
<p>Something is wrong</p> 
{% endif %} 

<form class="form-signin" action="" method="post"> 
    <h2 class="form-signin-heading">Login</h2> 
    {% csrf_token %} 

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email"> 

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password"> 

    <button class="btn btn-large btn-primary" type="submit">Login</button> 
    <input type="hidden" name="next" value="{{next|escape}}" /> 

</form> 

Tôi sử dụng chuyển hướng đến trang đăng nhập, sau đó đăng nhập hoặc mật khẩu sai, nhưng tôi muốn thực hiện thông báo lỗi trong trường hợp này. Tại sao xây dựng {% if form.errors%} không hoạt động? Cám ơn!

+2

Không hình thức đang được trả lại trong 'bạn HttpResponseRedirect'. – arulmr

+0

sử dụng biểu mẫu để kích hoạt form.errors – catherine

Trả lời

43

Vì biểu mẫu không có ý tưởng xảy ra lỗi.

Khi bạn xây dựng các mẫu tại đây:

form=LoginForm() 

Bạn đang xây dựng nó mà không đi qua nó bất kỳ thông tin. Nó không biết bất cứ điều gì về POST người dùng vừa làm hoặc đăng nhập thất bại hoặc mật khẩu bị thiếu hoặc bất kỳ lỗi nào.

Dưới đây là những hình thức đăng nhập của tôi trông giống như:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=255, required=True) 
    password = forms.CharField(widget=forms.PasswordInput, required=True) 

    def clean(self): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     if not user or not user.is_active: 
      raise forms.ValidationError("Sorry, that login was invalid. Please try again.") 
     return self.cleaned_data 

    def login(self, request): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     return user 

Chúng tôi ghi đè phương pháp của hình thức clean, do đó nếu các hình thức đi xác nhận, chúng tôi có thể kiểm tra các thông tin của người dùng. Chúng tôi cũng đặt một phương thức đăng nhập vào chính đối tượng biểu mẫu, để làm cho chế độ xem của chúng tôi rõ ràng hơn.

Tiếp theo, theo quan điểm của chúng tôi, chúng tôi muốn thực hiện điều này:

def login_view(request): 
    form = LoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
    return render(request, 'enter.html', {'login_form': form }) 

Chúng tôi nhanh chóng các hình thức và tay nó request.POST để kiểm tra chống lại.

Nếu chúng tôi có POST, chúng tôi kiểm tra xem biểu mẫu có hợp lệ hay không. Phương thức "sạch" của biểu mẫu sẽ được gọi và kiểm tra thông tin xác thực người dùng cho chúng tôi.

Nếu thông tin xác thực không thành công, chúng tôi sẽ đưa ra lỗi mà chúng tôi cần hiển thị trong mẫu của chúng tôi.

lỗi nêu ra bởi các hình thức (nhưng không gắn liền với một lĩnh vực) được lưu trữ trong non_field_errors, có thể được hiển thị như sau:

{% if form.non_field_errors %} 
    <ul class='form-errors'> 
     {% for error in form.non_field_errors %} 
      <li>{{ error }}</li> 
     {% endfor %} 
    </ul> 
{% endif %} 
1

Khi bạn chuyển hướng, tôi không chắc chắn bạn gửi ngữ cảnh của trang của mình. Vì vậy, khi bạn chuyển hướng đến/login/page, django tinks đó là một hình thức mới được nạp.