J'ai une page de connexion personnalisée Django. Je veux lever une exception lorsque les champs de nom d'utilisateur ou de mot de passe sont vides. Comment faire?
Ma méthode de connexion view.py:
def user_login(request):
context = RequestContext(request)
if request.method == 'POST':
# Gather the username and password provided by the user.
# This information is obtained from the login form.
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
print("auth",str(authenticate(username=username, password=password)))
if user:
# Is the account active? It could have been disabled.
if user.is_active:
login(request, user)
return HttpResponseRedirect('/')
else:
return HttpResponse("xxx.")
else:
# Bad login details were provided. So we can't log the user in.
print ("Invalid login details: {0}, {1}".format(username, password))
return HttpResponse("Invalid login details supplied.")
else:
return render_to_response('user/profile.html', {}, context)
J'ai essayé ça et ça n'a pas marché: c'est forms.py
def clean_username(self):
username = self.cleaned_data.get('username')
if not username:
raise forms.ValidationError('username does not exist.')
Vous pouvez utiliser la vue de connexion, qui est fournie par Django. Votre login.html devrait donc ressembler à cet exemple.
<form class="login" method="POST" action="/login/">
{% csrf_token %}
{{form.as_p}}
<li><input type="submit" class="logBut" value="Log in"/></li>
</form>
Et rappelez-vous urls.py!
url(r'^login/$','Django.contrib.auth.views.login', {'template_name': '/login.html'}),
L'approche correcte consiste à utiliser formulaires , au lieu de récupérer les variables directement à partir de request.POST
. Django validera alors les données du formulaire et affichera les erreurs lorsque le formulaire sera rendu dans le modèle. Si un champ de formulaire est requis, alors Django s'affichera automatiquement une erreur lorsque le champ est vide, vous n'avez même pas besoin d'écrire un clean_<field_name>
méthode pour cela.
Django a déjà un vue de connexion intégrée . L'approche la plus simple est de l'utiliser plutôt que d'écrire la vôtre. Si vous voulez toujours écrire votre propre vue, vous trouverez toujours utile de voir comment Django le fait.