2012-03-18 4 views
1

У меня есть вид входа ajax. Я могу войти нормально, но когда я войти неправильно мои JSon возвращается: { «ошибки»: {}} Моя точка зрения заключается в следующем:Django пустое сообщение об ошибке

def ajaxlogin(request): 
    from forms import LoginForm 
    form = LoginForm(request.POST) 
    logged_in = False 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if request.is_ajax() and user is not None: 
     login(request, user) 
     logged_in = True 
     return HttpResponse(simplejson.dumps({'redirect' : 'true'}), content_type='application/json') 
    else: 
     return HttpResponse(simplejson.dumps({'errors': dict(form.errors.items())}), content_type='application/json') 

Любые идеи?

Если я использую функцию входа в систему без разрешения js, форма отображает все соответствующие сообщения об ошибках.

Мой LoginForm:

from django import forms 
from django.contrib.auth.forms import AuthenticationForm 
from django.contrib.auth import authenticate 
from django.utils.translation import ugettext_lazy as _ 

class LoginForm(AuthenticationForm): 
    username = forms.CharField(min_length=5, max_length=30,error_messages={'required':_("please enter a username"), 'min_length':_("username must be at least 5 characters"), 'max_length':_("username must be at less than 30 characters")}) 
    password = forms.CharField(min_length=6, error_messages={'required':_("please enter a password"), 'min_length':_("password must be at least 6 characters")}) 

    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(_("you have entered an incorrect username and/or password")) 
      elif not self.user_cache.is_active: 
      raise forms.ValidationError(_("This account is inactive.")) 
     self.check_for_test_cookie() 
     return self.cleaned_data 
+0

в случае request.is_ajax() и пользователь не должен: None, что по имени пользователя или является "пользователь" правильный. Я не вижу ссылки на него в вашей локальной области. то же самое верно для входа fucntion –

+0

Im используя от django.contrib.auth import authenticate, login. «Пользователь» является правильным, поскольку я вхожу в систему с этим видом ajax. –

+0

Извините, я пропустил линию. Отредактировано –

ответ

1

Вы не показали нам, что ваш LoginForm выглядит. Предполагая, что у него есть только два CharField, я бы не ожидал никаких ошибок, если вы указали имя пользователя и пароль.

Чтобы показать ошибки в недопустимой комбинации имени пользователя и пароля, ваша форма должна включать логику для аутентификации данных входа.

К счастью, вы не пишете это сами, вы можете использовать Django's встроенный AuthenticationForm. Он вернет ошибку, если имя пользователя и пароль недействительны.

from django.contrib.auth.forms imoirt AuthenticationForm 
from django.contrib.auth import login as auth_login 

# in the view 
if request.method == "POST": 
    form = AuthenticationForm(data=request.POST) 
    if form.is_valid(): 
     # if the form is valid, the user has provided a valid 
     # username and password. We can get the user with the 
     # form.get_user method and log them in 
     auth_login(request, form.get_user()) 
     # return suitable ajax responses 
+3

Решенный !!! Я должен был (request.POST) быть (data = request.POST). Всем спасибо!!! –

+0

Я написал ответ, прежде чем вы отправили свою форму аутентификации, поэтому я не знаю, насколько это будет полезно. Мой единственный заключительный комментарий заключается в том, что вы не должны извлекать 'username' и' password' из 'request.POST'. В общем, проверьте, что ваша форма действительна, а затем получите значения из 'form.cleaned_data'. В этом случае вам даже не нужно выбирать имя и пароль uuse, так как форма аутентификации имеет метод get_user. – Alasdair

+2

Ой, это неясно! Почти во всех формах 'data' является первым аргументом в методе' __init__', поэтому 'request.POST' будет в порядке. Однако 'AuthenticationForm' принимает' запрос' в качестве своего первого аргумента, поэтому вам нужно * data = request.POST'. – Alasdair

0

попробовать что-то вроде:

return HttpResponse(simplejson.dumps({'errors': form.errors.as_text()}), content_type='application/json') 
Смежные вопросы