Django-fr

Forum

#1 17-06-2013 09:37:58

sesame
Membre
Inscription : 22-03-2011
Messages : 263

utilisation de form

bonjour

voila

pour soumetrre un formulaire et envoyer ma requete vers une fonction de filtrage j'utilise form pour recuperer dans la base une liste deroulante des proprietes

je recupere bien la liste deroulante le probleme vient du request.GET['lapropriete'] pour la fonction qui recupere les donneees de la requete

pour le model j'ai

class donnee(models.Model):
    name = models.CharField(_('name'), max_length= 150)


class Property(models.Model):
    name = models.CharField(_('name'), max_length=50)

class Physic2(models.Model):
    name = models.ForeignKey(Property, verbose_name=_('name'), null=True, blank=True)
    lapropriete = models.ForeignKey(donnee, verbose_name=_('lapropriete'),  blank=True)


pour form j'ai

class Physic2Form(forms.ModelForm):
    class Meta:
        model = Physic2

et dans view j'ai

def get_materials_one(request, category_slug=None):
    if category_slug is None:
        lafamille= 'general'
        propriete= Physic2Form()
        return render_to_response('material/critere1.html',
                                   {'unefamille': lafamille,
                                    'propriete': propriete},
                                     context_instance=RequestContext(request))


pour le template

<form id= "testjson" action="{% url chercher_filtre1 %}" method= "get"  onsubmit = "">

<table  width="10" HEIGHT=10 border="1" style="border: 0.5px;" cellspacing="0" cellpadding="0" >

<tr BGCOLOR="#FFFFB0">
<td width="100" style="text-align:center"><TT>Property</TT></td>
<td width="10" style="text-align:center"><TT>min val</TT></td>
<td width="10" style="text-align:center"><TT>max val</TT></td>
<td width="10" style="text-align:center"><TT>min T&#176C</TT></td>
<td width="10" style="text-align:center"><TT>max T&#176C</TT></td>

</tr>


<tr>

<td>
{{ propriete.lapropriete }}

</td>

.....


pour ma fonction
def search_filter1(request):
    try:
        val1 = []
        val2 = []
        var70= []
        val_min1 = float(request.GET['Vmin1'])
        val_max1 = float(request.GET['Vmax1'])
        T_min1 = float(request.GET['Tmin1'])
        T_max1 = float(request.GET['Tmax1'])

        valT1 = request.GET['lapropriete']            # propriete 1

si je fais un print de valT1 j'obtiens 1 si je selectionne la premiere propriete 2 pour la deuxieme...

comment recuperer une des proprietes (par ex 'Vickers Hardness')

le probleme vient de  request.GET['lapropriete']

Hors ligne

#2 18-06-2013 06:39:28

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

Re : utilisation de form

Bonjour,

Etant donné que les extraits de code sont incomplets, il va falloir extrapoler la réponse.

A priori, ces nombres correspondent aux ID de Physics2. Il te faudra donc récupérer les instances associées pour en prendre le nom.

Note: Le plus élégant serait de laisser le formulaire gérer le traitement de la requête et d'en récupérer les objects.

Hors ligne

#3 18-06-2013 06:51:55

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : utilisation de form

oui les nombres correspondent aux id de Physic2

peux tu me dire comment faire ?

ou me mettre sur une piste car je vois vraiment pas

Hors ligne

#4 18-06-2013 07:50:55

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : utilisation de form

dans le template si j'ecris

{% for choice in propriete.lapropriete %}

    {{ choice }}

{% endfor %}

il faudrait que j'associe un id et un nom a choice pour passer la requete

c'est ca ?

Hors ligne

#5 18-06-2013 20:24:28

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

Re : utilisation de form

Si tu nous disais ce que tu souhaites faire plutôt que comment tu voudrais le faire, les réponses seraient plus ciblées.

Récuperer une instance à partir d'un ID, c'est simple: instance = Property.objects.get(id=request.GET['Vmin1']) par exemple.
Utiliser le formulaire pour récuperer les instances, c'est mieux.

En revanche, je ne peux guère te guider efficacement, d'une part à cause de la remarque au dessus, d'autre part, parce que tes fragments de code ne sont pas cohérents (1 FK entre Physics2 et Property dans ton forumlaire alors que tu en récupères 4 dans la vue de traiement)..

Hors ligne

#6 19-06-2013 07:31:15

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : utilisation de form

c'st simple

je veux recuperer en liste deroulante les proprietes enregistrees dans la base

afin de me servir du formulaire et envoyer une requete vers une fonction de filtrage qui va me trouver tous les materiaux correspondant a la propriete xx variant entre vmin1 et vmax1 dant la plage de temperature Tmin1 Tmax1

j'ai trouvé la solution pour une requete sur une propriete

lorsque je clique sur le bouton submit j'envoie les donnees vers cette fonction qui cette fois me renvoie bien la propriete

def search_filter1(request):
    try:
        val_min1 = float(request.GET['Vmin1'])
        val_max1 = float(request.GET['Vmax1'])
        T_min1 = float(request.GET['Tmin1'])
        T_max1 = float(request.GET['Tmax1'])
        if request.method == 'GET':
            form = Physic2Form(request.GET)
            if form.is_valid():
                valT1 = form.cleaned_data['lapropriete']

maintenant si je voulais faire une requete sur deux proprietes comment faire pour dissocier les deux  ??


valmin1, valmax1, Tmin1, Tmax1 ne proviennent pas de la base

ce sont simplement des champ input du formulaire servant a la requete

Dernière modification par sesame (19-06-2013 10:31:29)

Hors ligne

#7 19-06-2013 10:42:58

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : utilisation de form

y aurait bien sur la solution de creer  dans la modele autant de classes que de criteres de filtrages souhaites

avec
'lapropriete'
'lapropriete2'
'lapropriete3' 

etc

Hors ligne

#8 20-06-2013 07:13:59

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

Re : utilisation de form

Bonjour,

Si tu as un nombre prédéfini de formulaires identiques, tu peux t'en sortir en jouant sur les prefix des formulaires afin qu'ils aient chacun une sorte d'espace de nommage (voir https://docs.djangoproject.com/en/dev/r … for-forms)

La solution plus complexe mais à mon avi plus propre est d'utiliser les formsets (voir https://docs.djangoproject.com/en/dev/t … formsets/)

Hors ligne

Pied de page des forums