Vous n'êtes pas identifié(e).
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
Quel est le message d'erreur ?
Hors ligne
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
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
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
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
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
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
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