Vous n'êtes pas identifié(e).
Bonjour à tous,
dans ma view recherche, je souhaite utiliser un champ "ModelChoiceField" qui propose plusieurs choix dont le choix "Toutes"
Mon probleme est que quand "Toutes" est sélectionné, ma recherche filtre les resultats de ce champ...en cherchant la valeur "Toutes" sauf que je voudrais justement que lorsque "Toutes" est sélectionné, ce soit comme si il n'y avait pas de regles de filtrage.
Deux solution:
mon premier essai dans [views.py]
if form.cleaned_data['activite']:
if form.cleaned_data["activite"] == "Toutes":
mondictionnaire['activite'] = Lieu.activite.all()
else:
mondictionnaire['activite'] = form.cleaned_data['activite']
sauf que ma syntaxe est mauvaise car j'ai une erreur (quelqu'un saurait il me corriger ?)
deuxieme possibilité:
enlever le champ "Toutes" des propositions....mais je ne sais pas faire.
Ligne concernée dans mon [forms.py]:activite = forms.ModelChoiceField(queryset=Activite.objects.all(), required=False)
Mais comment filtrer un seul champ de ma table "activite".... ?
Merci beaucoup
Rémy
Hors ligne
Bonsoir,
Deux solution:
mon premier essai dans [views.py]
if form.cleaned_data['activite']:
if form.cleaned_data["activite"] == "Toutes":
mondictionnaire['activite'] = Lieu.activite.all()
else:
mondictionnaire['activite'] = form.cleaned_data['activite']
je pense que dans le cas du else tu dois avoir un truc du genre
mondictionnaire['activite'] = Lieu.activite.filter(activite = form.cleaned_data['activite'])
deuxieme possibilité:
enlever le champ "Toutes" des propositions....mais je ne sais pas faire.
Ligne concernée dans mon [forms.py]:activite = forms.ModelChoiceField(queryset=Activite.objects.all(), required=False)
Je ne comprends pas bien mais voici comment tu pourrais procéder:
GAME_TYPES = (
('','ALL Types'),
('arcade','Arcade game'),
('battle','Battle game'),
('adventure','Adventure game'),
('sport','Sport game'),
('race','Race game'),)
class GameForm(forms.Form):
title = forms.CharField()
type = forms.ChoiceField(choices=GAME_TYPES,required=False,)
comment = forms.CharField(required=False)
Ou alors:
- inclure l'option : blank=True à ton models.activite
- definir ton form comme suit:
class activiteForm(forms.ModelForm):
class Meta:
model = models.activite
à plus
Hors ligne
Bonjour,
merci pour ta réponse, cependant cela ne répond pas à ma question.
Je n'ai sans doute pas été très clair, je reformule:
Dans ma base de donnée, j'ai une classe qui s'appelle "activite".
Dans cette classe il y à un seul champ, et il possede trois valeurs:
type_activite = Toutes
type_activite = week-end
type_activite = Sortie
J'utilise ces trois valeurs sous forme de menu déroulant pour réaliser des recherches dans un tableau.
Le probleme, c'est lorsque quelqu'un souhaite rechercher "Toutes" pour type d'activité, il faudrait qu'il ne renseigne pas le champ (car si il renseigne "Toutes", ma recherche va filtrer les lignes de mon tableau contenant toutes...et les lignes contenant "sortie" ou "week-end" seront alors ignorées...ce qui n'est pas le but !)
Donc deux solutions possible:
ou bien, dans ma views.py, je fais en sorte que le "Toutes" renvoie mes trois champs à la fois (Toutes, sortie et week-end)
ou bien, dans mon forms.py, je fais en sorte que "Toutes" ne soit pas proposé (le champ vide signifiant déjà "Toutes")
Quelqu'un saurait-il coder l'une des deux solutions ? (voir mon premier message pour mes essais en cours)
Merci beaucoup
Rémy
Hors ligne
Salut,
Quand tu a une erreur il faut toujours la préciser, c'est assez indispensable
pour t'aider au mieux et peut de personne possède le don de divination (en
plus c'est fatiguant à utiliser comme don).
Je suppose que ce n'est pas un SyntaxError de Python sinon tu l'aurais
détecté, probablement plutot une exception levée par le validateur de
modelchoicefield.
Ton utilisation de "mondictionnaire['activite'] = Lieu.activite.all()" ne peut
pas marcher vu que tu utilises un ModelChoiceField et qu'avec la query que tu
forces, tu lui renvoi une liste d'instances alors qu'il n'attends qu'une
unique instance.
Donc en théorie dans ce cas tu devrais plutôt utiliser un
ModelMultipleChoiceField qui lui est prévu pour recevoir une liste d'instance.
Cela dit ce champs est représenté par une liste de séléction multiple, donc il
faudra modifier ton query de recherche de résultats pour accepter plusieurs
items pour ton critère de recherche sur ton champ "activite".
Le plus simple est d'ajouter toi même un switch conditionnelle dans ta vue de
résultat pour faire directement un tonmodel.objects.all() dans le cas de la
séléction de la valeur "Toutes" et sinon un
tonmodel.objects.filter(monchamp=mavaleur) pour tout autre valeur de ton
critère.
Hors ligne