web-dev-qa-db-fra.com

Django. Message d'erreur pour le formulaire de connexion

Je fais le formulaire de login/mot de passe:

modèle:

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

vue:

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

uRL:

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

modèle:

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

J'utilise la redirection vers la page de connexion, puis la connexion ou le mot de passe est incorrect, mais je veux faire un message d'erreur dans ce cas. Pourquoi la construction {% if form.errors%} ne fonctionne pas? THX!

18
Wolter

Parce que le formulaire n'a aucune idée qu'une erreur s'est produite.

Lorsque vous construisez le formulaire ici:

form=LoginForm()

Vous le construisez sans lui transmettre aucune information. Il ne sait rien du POST que l'utilisateur vient de faire, ou que la connexion a échoué, ou que le mot de passe était manquant, ou quelle que soit l'erreur.

Voici à quoi ressemblent mes formulaires de connexion:

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

Nous remplaçons la méthode clean du formulaire, de sorte que si le formulaire réussit la validation, nous pouvons vérifier les informations d'identification de l'utilisateur. Nous avons également mis une méthode de connexion sur l'objet de formulaire lui-même, pour rendre notre vue plus propre.

Ensuite, à notre avis, nous voulons faire ceci:

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

Nous instancions le formulaire et lui remettons la demande. POST à ​​vérifier.

Si nous avons un POST, nous vérifions si le formulaire est valide. La méthode "propre" du formulaire sera appelée et vérifiera les informations d'identification de l'utilisateur pour nous.

Si les informations d'identification échouent, nous générons une erreur, que nous devons afficher dans notre modèle.

Les erreurs générées par le formulaire (mais non attachées à un champ) sont stockées dans non_field_errors, qui peuvent être affichées comme suit:

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

Lorsque vous redirigez, je ne suis pas sûr que vous envoyez le contexte de votre page. Ainsi, lorsque vous redirigez vers la page/login /, Django indique que c'est un nouveau formulaire qui est chargé.

1
Alex Grs