2016-02-11 2 views
0

Я создал страницу входа в систему, и она отлично работает! Но когда пользователь вводит неверные учетные данные, как я могу показать ошибку на странице входа? Я попробовал присвоить if и переменную, но это привело к тому, что отображаемая ошибка не имеет значения.Показать ошибки в форме входа

В моих взглядов, я установить «error_message» переменную следующим образом:

def LoginView(request): 
    error_message = '' 
    logout(request) 
    context = RequestContext(request) 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/") 
     else: 
      # Return a 'disabled account' error message 
      return HttpResponseRedirect("/") 
    else: 
     # Return an 'invalid login' error message 
    ---> error_message = "Incorrect username or password." 
    return render(request, 'profile/login.html', {'error_message': error_message}, context) 

Однако в моем шаблоне, эта переменная не отображается независимо от того, что, даже если я установить переменную внутри " if ".

Вот мой шаблон:

{% include '__header.html' %} 
<style> 
main { 
    width: 920px; 
    background: none; 
    margin-top: calc(50vh - 280px) 
} 
</style> 

<div class="form-container"> 
<form id="user" method="post" action="/login/" 
enctype="multipart/form-data" class="text"> 
    {% csrf_token %} 
    <div class="title">Login to your account</div> 
    <div class="form-col"> 
     <div class="field-container"> 
      <div class="field-input-container"> 
       <div class="field-label">Username</div> 
       <div class="field-input"> 
        <input class="field-input-element" type="text" name="username"/> 
       </div> 
      </div> 
     <div class="field-help"></div> 
     </div> 
    </div> 
    <div class="form-col"> 
     <div class="field-container" style="height: 110px"> 
      <div class="field-input-container"> 
       <div class="field-label">Password</div> 
       <div class="field-input"> 
       <input class="field-input-element" type="password" name="password"/> 
       </div> 
      </div> 
     <div class="field-error">{{ error_message }}</div> 
     <div class="field-help"></div> 
     </div> 
    </div> 
    <div class="form-button-container"> 
    <input type="submit" name="submit" value="Login" class="button form-button"/> 
    </div> 
</form> 
</div> 

{% include '__footer.html' %} 

Итак, как я могу показать сообщение об ошибке в шаблоне только если там была ошибка?


Обновленный код на основе ответов от (по-прежнему делает то же самое)

def LoginView(request): 
    template_name='profile/login.html' 
    logout(request) 
    context = RequestContext(request) 

    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect("/") 
      else: 
       # Return a 'disabled account' error message 
       return HttpResponseRedirect("/") 
     else: 
      # Return an 'invalid login' error message 
      error_message = "Incorrect username or password." 
    else: 
     error_message = '' 

    return render(request, 'profile/login.html', {'error_message': error_message}, context) 
+1

Почему бы не использовать [login view] (https://docs.djangoproject.com/en/1.9/topics/auth/default/#django.contrib.auth.views.login)? – Sayse

+0

Я хочу больше контролировать то, что на самом деле делает вид, и это отлично работает. Я не собираюсь шутить, пытаясь заставить что-то еще работать, когда это прекрасно работает. –

+1

Для чего стоит, что действительно нужно сделать, чтобы использовать django, эта ссылка, которую я предоставил, даже дает вам пример шаблона – Sayse

ответ

2

Логика, которая у вас есть для проверки пользователей детали должны быть сделаны только, если они размещены в форме, так что вы можете обернуть эту часть в if request.method == 'POST'

if request.method == 'POST': 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/") 
     else: 
      # Return a 'disabled account' error message 
      return HttpResponseRedirect("/") 
    else: 
     # Return an 'invalid login' error message 
     error_message = "Incorrect username or password." 

Вы также можете обернуть ваша ошибка DIV в

{% if error_message %} 
+0

Это то же самое. –

+0

@SebastianOlsen - Не могли бы вы обновить свой текущий вопрос, чтобы также включить то, что вы его обновили? Я не вижу, как это может быть – Sayse

+0

http://pastebin.com/X86z4mGX –

1

Ваша непосредственная проблема заключается в том, что вы настраиваете ваше сообщение об ошибке для GET и POST запросов. Вы должны показывать его только для запросов POST после отправки пользователем данных.

if request.method == "POST": 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     ... 
    else: 
     # Return an 'invalid login' error message 
     error_message = "Incorrect username or password." 
0

Вот пример того, что может быть полезным для вас, первого импорта и внутри вашего зрения объявить имя шаблона:

from django.contrib import messages 

template_name='your_app/login.html' #Inside the login view 

Затем, после того, как не удается Логин:

messages.error(request, "incorrect user or password") 

И последнее, рендеринг шаблона:

return render(request, self.template_name,{"form_group" : form_group}) 

Надеется, что это помогает.

+0

«Я» не определен. Кроме того, я хотел бы добавить, что я не использую форму, я просто получаю информацию из формы HTML, а затем отправляю ее на сервер с правильными полями. –

+0

Я вижу, что я бы посмотрел, где вы ввели код входа, код формы в рендеринге - это просто параметр, который я ставлю там на случай, если вы используете формы, или если yopu хочет вернуть неправильные значения пользователю – jsanchezs

+0

@jsanchezs - даже несмотря на то, что имя функции было LoginView, оно по-прежнему являлось функцией, основанной на представлении, а не представлением на основе класса, которое является тем, что ваш ответ предназначен для – Sayse

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