2011-12-07 31 views
23

Tôi đang cố gắng sử dụng biểu mẫu AuthenticationForm với django và tìm ra rằng tôi dường như không thể lấy biểu mẫu để xác thực. Tôi widdled nó xuống một thử nghiệm đơn giản (giả sử đó là chính xác) mà dường như không làm việc. Có ai thấy vấn đề ở đây không?Sử dụng AuthenticationForm trong Django

>>> from django.contrib.auth.forms import AuthenticationForm 
>>> POST = { 'username': 'test', 'password': 'me', } 
>>> form = AuthenticationForm(POST) 
>>> form.is_valid() 
False 

Có lý do thực sự nào không xác thực không? Tôi có sử dụng nó không chính xác không? Tôi đã mô hình hóa nó sau khi xem đăng nhập riêng của django.

Trả lời

37

Thử:

form = AuthenticationForm(data=request.POST) 
+0

Cảm ơn. Không chắc chắn làm thế nào tôi bị mất rằng trong chế độ xem mặc định của django. Tất cả các hình thức khác của tôi, tôi chỉ cần ném POST vào thể hiện, mà không cần sử dụng một kwarg. Bất kỳ ý tưởng gì khác nhau ở đây? –

+3

Nếu bộ nhớ phục vụ, AuthenticationForm hơi khác so với các bộ nhớ khác. Có một vài mâu thuẫn ở đây và ở Django. Thông thường tôi khởi tạo biểu mẫu bằng cách sử dụng: form = MyForm (request.POST hoặc None) – Brandon

2

Mã chức năng is_valid:

return self.is_bound and not bool(self.errors) 


>>> form.errors 
{'__all__': [u'Please enter a correct username and password. Note that both fields are case-sensitive.']} 

Nếu bạn thấy đoạn mã của phương pháp sạch của AuthenticationForm

def clean(self): 
    username = self.cleaned_data.get('username') 
    password = self.cleaned_data.get('password') 

    if username and password: 
     self.user_cache = authenticate(username=username, password=password) 
     if self.user_cache is None: 
      raise forms.ValidationError(_("Please enter a correct username and password. Note that both fields are case-sensitive.")) 
     elif not self.user_cache.is_active: 
      raise forms.ValidationError(_("This account is inactive.")) 
    self.check_for_test_cookie() 
    return self.cleaned_data 

"Vấn đề" là không thoát một người dùng với tên người dùng này và passowrd

+0

Bạn đang nhìn thấy is_valid này? django.forms.BaseForm? Bạn đang chạy phiên bản django nào? Tôi đang ở trên 1.3.1 ở đây. Nếu điều này là sử dụng cùng một phụ trợ như quản trị django, tôi đã thử với một người dùng hợp lệ/pass ... –

+0

Trong thân cây: https://code.djangoproject.com/browser/django/trunk/django/forms/forms. py # L119 hoặc trong Django 1.3.1 https://code.djangoproject.com/browser/django/tags/releases/1.3.1/django/forms/forms.py#L116 – Goin

+0

Cho tôi biết giá trị của form.errors – Goin

13

Sau một vài giờ dành cho việc tìm kiếm "Tại sao hack không có lỗi xác nhận?" Tôi chạy vào trang này: http://www.janosgyerik.com/django-authenticationform-gotchas/

AuthenticationForm 's số đầu tiên là không dữ liệu! tại tất cả:

def __init__(self, request=None, *args, **kwargs): 

So thats lý do tại sao bạn phải vượt qua req.POST để dữ liệu hoặc vượt qua cái gì khác trong đối số đầu tiên. Nó đã được quy định tại một trong những câu trả lời ở đây sử dụng:

AuthenticationForm(data=req.POST) 

Bạn cũng có thể sử dụng một trong những:

AuthenticationForm(req,req.POST) 
AuthenticationForm(None,req.POST) 
+0

Cuộc gọi tốt trên 'data ='. – freb

Các vấn đề liên quan