Django-fr

Forum

#1 15-11-2011 10:14:59

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

filtrage

bonjour

j'aimerai a l'aide de cette fonction recuperer les differentes temperatures correspondant au materiau (name) a la categorie (nature_unit ) et a la propriete (val_champ )

le filtrage ne semble pas marcher, 

def view_temperat(request, id):
    name = get_object_or_404(UniteProperty3, id=id)
    nature_unit = get_object_or_404(UniteProperty3, id=id)
    val_champ = get_object_or_404(UniteProperty3, id=id)
    return render_to_response('view_temp1.html', {
        'nature_unit': nature_unit,
        'name': name,
        'val_champ': val_champ,
        'T_elements': Temp_exp1.objects.filter(Q(name=name) & Q(nature_unit=nature_unit) & Q(val_champ=val_champ))
        })       

dans le modele j'ai :

class Physic(models.Model):
    nat = models.CharField(_('name'), max_length=50, choices = PROPRIETE)

    def __unicode__(self):
        return self.nat


class UniteProperty3(models.Model):
    name = models.ForeignKey(Material, verbose_name=_('name'))
    nature_unit = models.ForeignKey(Property, verbose_name=_('nature_unit'))                     
    val_champ = models.CharField(_('val_champ'), max_length=50, choices = PROPRIETE)               
    val1= models.FloatField(blank=True, null=False)                                               
    val2= models.FloatField(blank=True, null=False)                                             
    val_unit = models.CharField(_('val_unit'), max_length=50)                                                                                               

    def __unicode__(self):
        return '%s'  % (self.name)


class Temp_exp1(models.Model):
    name = models.ForeignKey(Material, verbose_name=_('name'))                                       
    nature_unit = models.ForeignKey(Property, verbose_name=_('nature_unit'))                         ...
    val_champ = models.ForeignKey(Physic, verbose_name=_('val_champ') )               ....
    val_T = models.IntegerField(blank=True, null=False)                                           
    val_min= models.FloatField(blank=True, null=False)                                             
    val_max= models.FloatField(blank=True, null=False)             
    unite = models.CharField(_('val_unit'), max_length=50)

    def __unicode__(self):
        return '%s'  % (self.name)


merci d'une reponse , peut etre la demarche est pas bonne...

Hors ligne

#2 15-11-2011 11:50:41

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : filtrage

je ne comprends pas bien :

    name = get_object_or_404(UniteProperty3, id=id)
    nature_unit = get_object_or_404(UniteProperty3, id=id)
    val_champ = get_object_or_404(UniteProperty3, id=id)

là tu appelle 3 fois le meme objet ?
logiquement tu devrais juste faire :

    unit = get_object_or_404(UniteProperty3, id=id)
   
et ensuite utiliser dans ton query : unit.name, unit.nature_unit, etc ...

Hors ligne

#3 15-11-2011 13:04:00

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

Re : filtrage

si je fait

unit = get_object_or_404(UniteProperty3, id=id)
    return render_to_response('view_temp1.html', {
        'unit.name': unit.name,
        'unit.nature_unit': unit.nature_unit,
        'unit.val_champ': unit.val_champ,
        'T_elements': Temp_exp1.objects.filter(unit.name=unit.name)

ca marche pas

Hors ligne

#4 15-11-2011 14:22:26

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

Re : filtrage

j'ai voulu m'inspirer de cela qui marche tres bien pour filtrer les proprietes (val_champ) par categorie (nature_unit)

def view_post1(request, slug):
    name = get_object_or_404(Material, slug=slug)
    return render_to_response('view_detail.html', {
        'name':name,
        'elements': UniteProperty3.objects.filter(name=name)
       
    })
   
pour flilter les temperatures par propriete,  j'y arrive pas...

Hors ligne

#5 15-11-2011 14:36:48

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : filtrage

sesame a écrit :

si je fait

unit = get_object_or_404(UniteProperty3, id=id)
    return render_to_response('view_temp1.html', {
        'unit.name': unit.name,
        'unit.nature_unit': unit.nature_unit,
        'unit.val_champ': unit.val_champ,
        'T_elements': Temp_exp1.objects.filter(unit.name=unit.name)

ca marche pas

quand tu recupere ton objet à la première ligne, tu le nomme 'unit'
ensuite tu accede à ses attributs avec unit.nom_attribut et ces attributs sont injectés dans ton dict de réponse
tu n'as pas à les appeller de la même façon, tu les appelles comme tu veux, l'important c'est juste de réutiliser les memes nom de variables dans ton template :

        'nom': unit.name,
        'nature': unit.nature_unit,
        'valeur': unit.val_champ,

Ensuite, en ce qui concerne ton query, le seul lien que je vois entre les modèles Temp_exp1 et UniteProperty3 c'est le champ "nature_unit"
Donc un query possible serait :

    'T_elements': Temp_exp1.objects.filter(nature_unit=unit.nature_unit)

Mais je ne connais pas ton application
Je pense que tu devrais prendre le temps d'imprimer et de potasser la doc de django sur les Models et Query

Hors ligne

#6 16-11-2011 10:37:03

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

Re : filtrage

ce que j'ai pas compris est aussi la correspondance entre les champs crees dans l'admin et le page not found correspondant a l'id...apres avoir clique sur le lien dynamique de la propriete..??

Hors ligne

#7 16-11-2011 12:10:47

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : filtrage

Conseil général : tu devrais quand meme passer plus de temps à rédiger tes questions sur le forum, elles sont un peu obscures.

Tu as un "page not found" où ? dans l'admin ou sur le site public ?

Hors ligne

#8 16-11-2011 14:41:10

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

Re : filtrage

oui

je vais rediger le plus clair possible

Hors ligne

#9 17-11-2011 09:21:09

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

Re : filtrage

bonjour


voila le probleme que j'ai qcq soit la facon dont j'ecrit la fonction
j'ai pour le modele

class UniteProperty3(models.Model):
    name = models.ForeignKey(Material, verbose_name=_('name'))
    nature_unit = models.ForeignKey(Property, verbose_name=_('nature_unit'))                      # mecanique, thermique...
    val_champ = models.CharField(_('val_champ'), max_length=150)             # durete Vickers....
    val1= models.FloatField(blank=True, null=False)                                               # valeur numerique min
    val2= models.FloatField(blank=True, null=False)                                               # valeur numerique max
    val_unit = models.CharField(_('val_unit'), max_length=50)                     # unite  (GPa, Kg,....)
                                                                           

    def __unicode__(self):
        return '%s'  % (self.name)

    @permalink
    def get_absolute_url(self):
        return ('view_allmat_temp',[self.id])

class Temp_exp(models.Model):
    name = models.ForeignKey(Material, verbose_name=_('name'))                                       ....
    nature_unit = models.ForeignKey(Property, verbose_name=_('nature_unit'))                          ...
    val_champ = models.CharField(_('val_champ'), max_length=150)               ....
    val_T = models.IntegerField(blank=True, null=False)                                           
    val_min= models.FloatField(blank=True, null=False)                                             
    val_max= models.FloatField(blank=True, null=False)                                             
    unite = models.CharField(_('val_unit'), max_length=50)

le module url

url( r'^allmat/temp/(?P<id>[^\.]+).html',
    'dreamer.allmat.views.lit_prop_temp',
        name='view_allmat_temp'),

la vue

def lit_prop_temp(request, id):
    T_elements = get_object_or_404(Temp_exp, id=id)
    return render_to_response('view_temp1.html', {'T_elements': T_elements}


les liens dynamiques

{% ifequal pp.val_champ 'durete vickers' %}
<td width="150" <TT><a href="{{pp.get_absolute_url}}"> {{ pp.val_champ}}</a </TT></td>

<td width="150" <TT>{{ pp.val1}} </TT></td>
<td width="150" <TT>{{ pp.val2}} </TT></td>
<td width="150" <TT>{{ pp.val_unit}} </TT></td>

{% else %}

{% ifequal pp.val_champ 'module elasticite' %}
<td width="150" <TT><a href="{{pp.get_absolute_url}}"> {{ pp.val_champ}}</a </TT></td>

<td width="150" <TT>{{ pp.val1}} </TT></td>
<td width="150" <TT>{{ pp.val2}} </TT></td>
<td width="150" <TT>{{ pp.val_unit}} </TT></td>

{% else %}

{% ifequal pp.val_champ 'resistivite' %}
<td width="150" <TT><a href="{{pp.get_absolute_url}}"> {{ pp.val_champ}}</a </TT></td>

etc....

les deux premiers liens renvoient les bonnes pages

http://127.0.0.1:8000/allmat/temp/1.html
http://127.0.0.1:8000/allmat/temp/2.html

et le troisieme lien renvoie
http://127.0.0.1:8000/allmat/temp/9.html

evidemment page not found...

le probleme vient il de get absolute url

bien sur la fonction ne prend en compte ni le nom du materiau ni le type de categorie (mecanique, electrique...)

Hors ligne

#10 17-11-2011 20:19:17

quinode
Membre
Lieu : Auvergne
Inscription : 14-10-2010
Messages : 89
Site Web

Re : filtrage

pas vraiment DRY tout ça...

es-tu sur de l'expression régulière utilisée dans ton url :

    url( r'^allmat/temp/(?P<id>\d+).html',

serait plus simple

Hors ligne

Pied de page des forums