Il semble que je ne puisse pas faire cet exemple print "Tu n'as rien soumis!" ... à chaque fois que je soumets un formulaire vide
Vous avez soumis: u ''
au lieu de:
Vous n'avez rien soumis!
Où me suis-je trompé?
views.py
def search(request):
if 'q' in request.GET:
message = 'You submitted: %r' % request.GET['q']
else:
message = 'You submitted nothing!'
return HttpResponse(message)
modèle:
<html>
<head>
<title> Search </title>
</head>
<body>
<form action="/search/" method="get" >
<input type="text" name = "q">
<input type="submit"value="Search"/>
</form>
</body>
</html>
Appeler /search/
devrait avoir pour résultat "vous n'avez rien soumis", mais appeler /search/?q=
devrait en revanche donner "vous avez soumis u ''"
Les navigateurs doivent ajouter le q=
même lorsqu'il est vide, car ils doivent inclure tous les champs du formulaire. Un tel comportement ne peut se produire que si vous effectuez des manipulations DOM en Javascript (ou une action d'envoi javascript personnalisée), mais uniquement si l'utilisateur a activé javascript. Donc, vous devriez probablement simplement tester les chaînes non vides, par exemple:
if request.GET.get('q'):
message = 'You submitted: %r' % request.GET['q']
else:
message = 'You submitted nothing!'
q = request.GET.get("q", None)
if q:
message = 'q= %s' % q
else:
message = 'Empty'
puisque votre formulaire a un champ appelé 'q', le laisser vide envoie toujours une chaîne vide.
essayer
if 'q' in request.GET and request.GET['q'] != "" :
message
else
error message
En python, None, 0, "" (chaîne vide), False sont tous acceptés, None.
Alors:
if request.GET['q']: // true if q contains anything but not ""
message
else : //// since this returns "" ant this is equals to None
error
Voici un bon moyen de le faire.
from Django.utils.datastructures import MultiValueDictKeyError
try:
message = 'You submitted: %r' % request.GET['q']
except MultiValueDictKeyError:
message = 'You submitted nothing!'
Vous n'avez pas besoin de vérifier à nouveau si q est dans la requête GET. L'appel dans QueryDict. get vous le fait déjà.
from Django.http import QueryDict
def search(request):
if request.GET.\__contains__("q"):
message = 'You submitted: %r' % request.GET['q']
else:
message = 'You submitted nothing!'
return HttpResponse(message)
Utilisez cette manière, le document officiel Django a recommandé la méthode __contains__. Voir https://docs.djangoproject.com/fr/1.9/ref/request-response/
def search(request):
if 'q' in request.GET.keys():
message = 'You submitted: %r' % request.GET['q']
else:
message = 'You submitted nothing!'
return HttpResponse(message)
vous pouvez utiliser si ... aussi.