update personalizados formularios form example bootstrap avanzados django forms login message

personalizados - Django. Mensaje de error para el formulario de inicio de sesión



modelform django (2)

Cuando rediriges, no estoy seguro de que envíes el contexto de tu página. Entonces, cuando redirecciona a la página / login /, django tinks es una nueva forma que se carga.

Hago el formulario de inicio de sesión / contraseña:

modelo:

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

ver:

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

modelo:

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

Utilizo la redirección a la página de inicio de sesión, luego el inicio de sesión o la contraseña son incorrectos, pero quiero hacer un mensaje de error en este caso. ¿Por qué la construcción {% if form.errors%} no funciona? ¡Gracias!


Porque el formulario no tiene idea de que haya ocurrido un error.

Cuando construyes el formulario aquí:

form=LoginForm()

Lo estás construyendo sin pasarle ninguna información. No sabe nada acerca de la POST que el usuario acaba de hacer, o que el inicio de sesión falló, o que faltó la contraseña, o cualquiera que sea el error.

Así es como se ven mis formularios de inicio de sesión:

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

Anulamos el método clean del formulario, de modo que si el formulario pasa la validación podemos verificar las credenciales del usuario. También ponemos un método de inicio de sesión en el objeto del formulario para que nuestra vista sea más clara.

A continuación, en nuestra opinión, queremos hacer esto:

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

Creamos una instancia del formulario y le damos la solicitud. PULTE para verificar.

Si tenemos un POST, verificamos si el formulario es válido. Se llamará al método "limpio" del formulario y verificará las credenciales de usuario.

Si las credenciales fallan, generamos un error que debemos mostrar en nuestra plantilla.

Los errores provocados por el formulario (pero no adjuntos a un campo) se almacenan en non_field_errors, que se pueden mostrar de la siguiente manera:

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