Django-fr

Forum

#1 11-05-2015 09:58:13

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

AND et OR requête avec django

Bonjour, je cherche à creer une condition pour un formulaire de recherche.

En effet:
- j'ai une table "ville" avec id et ville
- j'ai un formulaire avec 2 champs: "départ" et "arriver"

Lorsque les deux champs sont remplis, pas de soucis, la requête s'exécute bien. Mais si je n'ai qu'un champs de rempli, cela m'affiche un message d'erreur. Cette, je peux contourner cela en forçant l'utilisateur à remplir tout les champs mais bon.

Je souhaiterai faire un XOR, un peu comme en PHP

views.py
def recherche(request):
    if request.method == 'POST':
        recherche_form = RechercheForm(request.POST)
 
        reponse = request.POST.get('depart')
        print 'Reponse'
        print reponse
 
        Id= Ville.objects.get(ville=reponse).id
        print 'Id'
        print Id
 
        reponse_a = request.POST.get('arriver')
        print 'Reponse_a'
        print reponse_a
 
        Id_a= Ville.objects.get(ville=reponse_a).id
 
        if recherche_form.is_valid():
            depart = recherche_form.cleaned_data['depart']
            arriver = recherche_form.cleaned_data['arriver']
 
            resultat = Formulaire.objects.filter(Q(depart_id=Id)&Q(arriver_id=Id_a))
            print resultat
                #Affichage de la page "resultat_recherche"
            return render(request, 'blabla/resultat_recherche.html', {'resultat_recherche': resultat})
    else:
        recherche_form = RechercheForm()
 
    return render(request, 'blabla/recherche.html', {'recherche_form': recherche_form})

J'ai essayé en mettant des
   

if reponse==None:
id=None

ou

if request.POST.get('depart')==None:
reponse=None

Et quelques conditions avant les requetes, mais cela ne veut rien savoir !!

Merci à vous

Hors ligne

#2 13-05-2015 07:47:07

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : AND et OR requête avec django

Quel est le message d'erreur ?

Hors ligne

#3 13-05-2015 08:56:35

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : AND et OR requête avec django

Bonjour,

Le message d'erreur est le suivant dans le cas où je n'ai rempli que le champ "Depart" et laissé vide le champ "Arrivé"

Ville matching query does not exist.
et 
Id_a= Ville.objects.get(ville=reponse_a).id

Merci

Hors ligne

#4 29-05-2015 19:44:44

Drife
Membre
Inscription : 15-03-2015
Messages : 8

Re : AND et OR requête avec django

Ou je comprend pas ou c'est trivial :-)

Chainage des filters :

resultat = Formulaire.objects
if depart:
    resultat = resultat.filter(depart_id=Id)
if arriver:
    resultat = resultat.filter(arriver_id=Id_a)

t'as pas besoin de requêtes Q pour ça d'ailleurs...

Dernière modification par Drife (29-05-2015 20:54:26)

Hors ligne

#5 30-05-2015 12:42:38

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : AND et OR requête avec django

Salut,

Mon formulaire possède 2 champs: Départ et Arrivée.

Ce que je souhaite c'est pouvoir faire la recherche sur un seul champ (ex: Départ) ou les deux. Or avec la code ci dessous, je suis obligé de remplir les deux champs:

def recherche(request):
    if request.method == 'POST':
        recherche_form = RechercheForm(request.POST)

        reponse = request.POST.get('depart')

        Id= Ville.objects.get(ville=reponse).id

        reponse_a = request.POST.get('arriver')

        Id_a= Ville.objects.get(ville=reponse_a).id

        if recherche_form.is_valid():
            depart = recherche_form.cleaned_data['depart']
            arriver = recherche_form.cleaned_data['arriver']

            resultat = Formulaire.objects.filter(Q(depart_id=Id)&Q(arriver_id=Id_a))
                #Affichage de la page "resultat_recherche"
            return render(request, 'blabla/resultat_recherche.html', {'resultat_recherche': resultat})
    else:
        recherche_form = RechercheForm()
    return render(request, 'blabla/recherche.html', {'recherche_form': recherche_form})

Si je ne mets qu'un seul champ, j'ai un message d'erreur:

Ville matching query does not exist.

Voici le code du model

class Ville(models.Model):
    ville=models.CharField(max_length=20)
    def __unicode__(self):  # Python 3: def __str__(self):
        return str(self.ville)

Merci

Hors ligne

#6 30-05-2015 15:14:17

Drife
Membre
Inscription : 15-03-2015
Messages : 8

Re : AND et OR requête avec django

Bon.

Concernant ta question, je t'ai déjà dit comment faire pour le XOR.

Pour ton erreur avec un seul champ fourni, elle est évidente non ?
ton utilisateur ne fourni pas la variable.
Donc tu fais une requête en demandant à Django de rechercher une ville avec le nom vide.
Tandam ! Y'en a pas. Quelle surprise ! Donc get renvoit une erreur. (get interdit un retour vide...).

En plus ton code n'est ni fait ni à faire: tu fais des requêtes avec un formulaire même pas validé: strictement interdit !
Bref, je sais pas trop quel est ton projet mais, va vite refaire un bon tuto sur django, parce que là tu ne maitrise pas les bases...

Pour corriger cette erreur, il faut tout ré-écrire...En bon Django.

Hors ligne

#7 06-06-2015 11:04:51

cobra85
Membre
Inscription : 11-05-2015
Messages : 58

Re : AND et OR requête avec django

Bonjour,

Merci pour votre réponse, mais je ne vois pas où sont mes erreurs.

Ce formulaire est censé aller chercher des valeurs dans une table (normal jusque là). C'est valeur sont les foreign key de valeur présent dans la table "ville".
Ce que j'ai fais, c'est faire en sorte de récupérer les nom_de_ville en fonction de l'ID

Après, je débute en django (ça se voit), mais j'ai suivi les tuto d'Openclassrom et du site officiel plus quelques autres

Hors ligne

#8 06-06-2015 14:34:09

Drife
Membre
Inscription : 15-03-2015
Messages : 8

Re : AND et OR requête avec django

Bonjour,

Et bien il faut relire les tutos.
Le nom des variables ? pas parlant...
L'utilisation du get alors que la variable fournie a le droit d'être vide ? C'est l'erreur assurée, celle que tu te tapes d'ailleurs.
tu charges des variables dans le "is_valid()" depart et arrivee que tu n'exploite même pas...

Alors voici un code correct (non-testé), charge à toi de le comprendre:

recherche_form = RechercheForm(request.POST)

        #Dans la validation, on vérifiera qu'on a rempli au moins le départ ou l'arrivée
        if recherche_form.is_valid():
            depart = recherche_form.cleaned_data['depart']
            arriver = recherche_form.cleaned_data['arriver']

            # ou alors du get avec le traitement d'exception si resultat vide
            depart = Ville.objects.filter(ville=depart)
            arriver = Ville.objects.filter(ville=arriver)

           resultat = Formulaire.objects
            if depart:
                  resultat = Formulaire.objects.filter(depart_id=depart[0].id) #On prend le premier résultat de la requête
            if arriver:
                  resultat = Formulaire.objects.filter(arriver_id=arriver[0].id)

            return render(request, 'blabla/resultat_recherche.html', {'resultat_recherche': resultat})

Dernière modification par Drife (06-06-2015 14:34:30)

Hors ligne

#9 07-06-2015 00:14:39

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : AND et OR requête avec django

cobra85, la solution au problème est pourtant toute simple. Sil vous n'avez pas de valeur dans le champs arrivée, vous faite un filtrage sur le départ, sinon, c'est la requête avec un Q pour faire le ou.

Hors ligne

Pied de page des forums