2013-02-26 5 views
14

Я делаю вид Логин/пароль:Django. Сообщение об ошибке для формы входа

модель:

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

вид:

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}) 

URLs:

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

шаблона:

{% 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> 

Я использую перенаправление на страницу входа в систему, а затем логин или пароль не так, но я хочу сделать сообщение об ошибке в этом случае. Почему конструкция {% if form.errors%} не работает? Спасибо!

+2

Никакая форма не визуализируется в вашем 'HttpResponseRedirect'. – arulmr

+0

используйте форму для запуска form.errors – catherine

ответ

43

Поскольку форма не имеет понятия, произошла ошибка.

Когда вы строите форму здесь:

form=LoginForm() 

Вы Построив его, не передавая ей какую-либо информацию. Он ничего не знает о POST, который только что сделал пользователь, или о том, что вход в систему не удался, или что пароль отсутствует, или что бы это ни случилось.

Вот что мои формы входа выглядеть следующим образом:

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 

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

Далее, по нашему мнению, мы хотим сделать это:

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 }) 

Мы инстанцируем форму и передать ее в request.POST, чтобы проверить против.

Если у нас есть POST, мы проверяем, действительна ли форма. Метод «чистый» формы будет вызван и проверяет учетные данные пользователя для нас.

Если учетные данные терпят неудачу, мы вызываем ошибку, которую мы должны показать в нашем шаблоне.

Ошибки, поднятые формы (но не привязан к полю), хранятся в non_field_errors, которые могут отображаться следующим образом:

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

Когда вы перенаправляете, я не уверен, что вы отправляете контекст своей страницы. Поэтому, когда вы перенаправляетесь на страницу/login/page, django tinks - это новая форма, которая загружается.

Смежные вопросы