web-dev-qa-db-fra.com

Django request.GET

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>
19
MacPython

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!'
32
tux21b
q = request.GET.get("q", None)
if q:
    message = 'q= %s' % q
else:
    message = 'Empty'
14
Davor Lucic

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
2
second

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
2
FallenAngel

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à. 

1
joaonrb
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/

1
Halit Yurttaş
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.

0
7i11