Django. Message d'erreur pour le formulaire de connexion

je fais login/mot de passe de la forme:

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 rediriger vers la page de connexion puis la connexion ou le mot de passe est erroné, mais je veux faire un message d'erreur dans ce cas. Pourquoi la construction (%Si forme.les erreurs %} ne fonctionne pas? Thx!

15
demandé sur karthikr 2013-02-26 12:35:22

2 réponses

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 sur le POST que l'utilisateur vient de faire, ou que le login 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 outrepassons le formulaire clean méthode, de sorte que si le formulaire de passe validation nous pouvons vérifier les justificatifs d'identité de l'utilisateur. Nous avons aussi mis une méthode de login sur l'objet form 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.POSTE à vérifier.

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

si les justificatifs d'identité échouent, nous soulevons une erreur, qui nous avons besoin de montrer dans notre modèle.

les erreurs soulevées par le formulaire (mais non attachées à un champ) sont stockées dans des 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 %}
48
répondu Jack Shedd 2017-09-08 14:58:51

lorsque vous redirigez, Je ne suis pas sûr que vous envoyez le contexte de votre page. Ainsi, lorsque vous redirigez vers le fichier /login/ page, django tine que c'est un nouveau formulaire qui est chargé.

1
répondu Alex Grs 2013-02-26 08:43:55