Django-fr

Forum

#1 15-01-2011 18:55:33

Rémycube
Membre
Inscription : 05-01-2011
Messages : 23

jouer avec ce que contient "form.cleaned_data"

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

#2 15-01-2011 19:45:17

afranck64
Membre
Inscription : 30-12-2010
Messages : 20

Re : jouer avec ce que contient "form.cleaned_data"

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 smile

Hors ligne

#3 16-01-2011 10:53:21

Rémycube
Membre
Inscription : 05-01-2011
Messages : 23

Re : jouer avec ce que contient "form.cleaned_data"

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

#4 16-01-2011 11:30:32

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : jouer avec ce que contient "form.cleaned_data"

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

Pied de page des forums