2014-11-11 5 views
1

Я очень новичок в Python и django. И у меня в настоящее время проблема, которую я не могу преодолеть. Я пробовал читать все документы и поисковые запросы, но пока ничего.Сообщение об ошибке Django crispy forms

У меня очень обычная форма для входа в систему, которую мне нужно использовать. Весь код есть до сих пор. Я просто хочу аутентифицировать пользователя (который отлично работает), но если они вводят неправильные данные, я хочу показать сообщение об ошибке в форме, в которой указаны неверные данные для входа, вместо того, чтобы возвращать HttpResponse, но я не могу понять, как именно для отображения ошибки auth, подобной этой, в такой хрустящей форме.

Любая помощь будет высоко ценится

Ах да, и это питон 3.4, если это делает никакой разницы

Это мой forms.py:

class UserLoginForm(forms.ModelForm): 
    email = forms.CharField(
     label="Your email address", 
     max_length=80, 
     required=True, 
    ) 

    password = forms.CharField(
     label="Your password", 
     required=True, 
    ) 

    def __init__(self, *args, **kwargs): 
     super(UserLoginForm, self).__init__(*args,**kwargs) 

     self.helper = FormHelper(self) 
     self.helper.form_id = 'form-login' 
     self.helper.form_class = 'form-login' 
     self.helper.form_method = 'POST' 
     self.helper.form_action = 'login' 
     self.helper.field_class = 'form-control input-lg' 
     self.helper.form_show_errors = True 
     self.helper.layout = Layout(
      Field('email', template='crispy/login_input_email.html'), 
      Field('password', template='crispy/login_input_password.html'), 
     ) 

     self.helper.layout.append(Submit('login', 'Log me in', css_class='btn btn-primary btn-lg')) 

    class Meta: 
     model = User 
     fields = ('email', 'password',) 

Это моя точка зрения. ру:

def login_view(request, template_name='login.html'): 

    redirect_url = request.GET.get('next') 

    if request.method=='POST': 
     loginForm = UserLoginForm(request.POST) 
     if loginForm.is_valid(): 

      username = loginForm.cleaned_data.get('email') 
      password = loginForm.cleaned_data.get('password') 

      user = authenticate(username=username, password=password) 
      if user is not None: 
       if redirect_url is None: 
        redirect_url='/home' 

       login(request, user) 
       return HttpResponseRedirect(redirect_url) 
      return HttpResponse("Invalid login details supplied.") 
     return render_to_response(template_name, {'crispy_form': loginForm}, context_instance=RequestContext(request)) 
    else: 
     loginForm = UserLoginForm() 
    return render_to_response(template_name, {'crispy_form': loginForm}, context_instance=RequestContext(request)) 

И, наконец, это мой шаблон:

{% extends "master.html" %} 

{% load crispy_forms_tags %} 

{% block content %} 
    <div class="inner-block"> 
     <h1>Log in to your account</h1> 
     {% crispy crispy_form crispy_form.helper %} 
    </div> 
{% endblock %} 

Благодаря

ответ

2

Используйте система обмена сообщениями

from django.contrib import messages 

... 
else: 
    messages.error(request, "Your error message") 
    loginForm = UserLoginForm() 
.... 

Проверка на док django.contrib.messagges.

+0

Отлично. Это было решение, которое в конечном итоге работало на меня. Thanks – NightStalker

+0

Запомнить голосовать! :-) –

0

Вы также можете проверить и узнать, добавлен ли атрибут HTML5 required в теги элементов формы для элементов, которые вы определили по своему усмотрению в models.py.

Если вы и какие-либо элементы отсутствуют в вашей форме, проверка на стороне клиента HTML5 в вашем браузере запрещает отправку формы, поэтому вы не получаете request.POST и, следовательно, никакой проверки на стороне сервера Django и, следовательно, нет form.errors.

Я провел несколько дней, озадачив этот вопрос. В любом случае, начиная с Django 1.10, вы можете turn off the HTML5 required attribute в элементах формы * и полагаться на проверку Django на стороне сервера (и сообщения об ошибках шаблона).

* В моем тестировании поддержка пузырьков формы HTML5 была удалена/пропущена, и у меня есть пользователи в заблокированных машинах, у которых может не быть последней, самой большой версии браузера.

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