Django-fr

Forum

#1 06-06-2009 13:29:36

Thomas Petazzoni
Membre
Inscription : 11-08-2010
Messages : 2

Rendu d'un champ personnalisé de modèle

Bonjour,

Je souhaite créer un nouveau champ pour mes modèles, qui permette de
stocker un numéro de mois, mais qui soit rendu comme une liste
déroulante avec janvier, février, ..., décembre dans.

Dans mon models.py, j'ai donc fait :

class MonthField(models.IntegerField):
    def __init__(self, *args, **kwargs):
        locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
        kwargs['choices'] = [(s, calendar.month_name[s]) for s in range(1, 13)]
        super(MonthField, self).__init__(*args, **kwargs)

Puis dans mon modèle :

    periodstart = MonthField(blank=True, null=True)

Ça marche très bien, ça stocke bien la valeur dans la base et ça
m'affiche effectivement une liste déroulante.

Par contre, quand je fais {{ monobjet.periodstart }} dans un template,
lors du rendu, ça m'affiche un numéro et pas le nom du mois
correspondant à ce numéro. Et je ne sais pas comment faire pour
personnaliser le rendu d'un champ.

Une piste ?

Merci,

Thomas

Hors ligne

#2 06-06-2009 13:45:12

Jérémie Ducastel
Membre
Inscription : 11-08-2010
Messages : 16

Re : Rendu d'un champ personnalisé de modèle

je crois que le plus simple serait d'utiliser un SmallIntegerField en
definissant les paires de tuples valeur, nom.

Ensuite tu fais appel à la methode get_FOO_display() pour afficher le
nom. Si le champ se nomme mois da

Le 6 juin 2009 14:29, Thomas Petazzoni<thomas.petazzoni _AT_ enix.org> a écrit :
> Bonjour,
>
> Je souhaite créer un nouveau champ pour mes modèles, qui permette de
> stocker un numéro de mois, mais qui soit rendu comme une liste
> déroulante avec janvier, février, ..., décembre dans.
>
> Dans mon models.py, j'ai donc fait :
>
> class MonthField(models.IntegerField):
>    def __init__(self, *args, **kwargs):
>        locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
>        kwargs['choices'] = [(s, calendar.month_name[s]) for s in range(1, 13)]
>        super(MonthField, self).__init__(*args, **kwargs)
>
> Puis dans mon modèle :
>
>    periodstart = MonthField(blank=True, null=True)
>
> Ça marche très bien, ça stocke bien la valeur dans la base et ça
> m'affiche effectivement une liste déroulante.
>
> Par contre, quand je fais {{ monobjet.periodstart }} dans un template,
> lors du rendu, ça m'affiche un numéro et pas le nom du mois
> correspondant à ce numéro. Et je ne sais pas comment faire pour
> personnaliser le rendu d'un champ.
>
> Une piste ?
>
> Merci,
>
> Thomas
> --
> Thomas Petazzoni                         http://thomas.enix.org
> Promouvoir et défendre le Logiciel Libre http://www.april.org
> Logiciels Libres à Toulouse              http://www.toulibre.org
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 06-06-2009 13:46:43

Jérémie Ducastel
Membre
Inscription : 11-08-2010
Messages : 16

Re : Rendu d'un champ personnalisé de modèle

argh saleté de gmail. je disais, si le champ s'appelle "mois" dans ton
modele, django generera une methode get_mois_display() qui donnera le
nom du mois.

Le 6 juin 2009 14:45, Jérémie Ducastel<jeremie _AT_ ducastel.name> a écrit :
> je crois que le plus simple serait d'utiliser un SmallIntegerField en
> definissant les paires de tuples valeur, nom.
>
> Ensuite tu fais appel à la methode get_FOO_display() pour afficher le
> nom. Si le champ se nomme mois da
>
> Le 6 juin 2009 14:29, Thomas Petazzoni<thomas.petazzoni _AT_ enix.org> a écrit :
>> Bonjour,
>>
>> Je souhaite créer un nouveau champ pour mes modèles, qui permette de
>> stocker un numéro de mois, mais qui soit rendu comme une liste
>> déroulante avec janvier, février, ..., décembre dans.
>>
>> Dans mon models.py, j'ai donc fait :
>>
>> class MonthField(models.IntegerField):
>>    def __init__(self, *args, **kwargs):
>>        locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
>>        kwargs['choices'] = [(s, calendar.month_name[s]) for s in range(1, 13)]
>>        super(MonthField, self).__init__(*args, **kwargs)
>>
>> Puis dans mon modèle :
>>
>>    periodstart = MonthField(blank=True, null=True)
>>
>> Ça marche très bien, ça stocke bien la valeur dans la base et ça
>> m'affiche effectivement une liste déroulante.
>>
>> Par contre, quand je fais {{ monobjet.periodstart }} dans un template,
>> lors du rendu, ça m'affiche un numéro et pas le nom du mois
>> correspondant à ce numéro. Et je ne sais pas comment faire pour
>> personnaliser le rendu d'un champ.
>>
>> Une piste ?
>>
>> Merci,
>>
>> Thomas
>> --
>> Thomas Petazzoni                         http://thomas.enix.org
>> Promouvoir et défendre le Logiciel Libre http://www.april.org
>> Logiciels Libres à Toulouse              http://www.toulibre.org
>>
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
>>
>

Hors ligne

#4 06-06-2009 13:49:22

Thomas Petazzoni
Membre
Inscription : 11-08-2010
Messages : 2

Re : Rendu d'un champ personnalisé de modèle

Le Sat, 6 Jun 2009 14:45:12 +0200,
Jérémie Ducastel <jeremie _AT_ ducastel.name> a écrit :

> je crois que le plus simple serait d'utiliser un SmallIntegerField en
> definissant les paires de tuples valeur, nom.
>
> Ensuite tu fais appel à la methode get_FOO_display() pour afficher le
> nom. Si le champ se nomme mois da

Sauf que ce champ, je l'utilise plusieurs fois dans mon modèle. Et
j'aimerais mieux ne pas avoir à définir plusieurs get_FOO_display().
Mon but était de factoriser tout ça dans un champ générique (ici
MonthField).

Merci,

Thomas

Hors ligne

#5 06-06-2009 14:10:42

Jérémie Ducastel
Membre
Inscription : 11-08-2010
Messages : 16

Re : Rendu d'un champ personnalisé de modèle

Dans ce cas, il faut peut etre que tu crées une class Month avec une
fonction __unicode__ qui renverra le nom plutot que le le numero, et
dans ta class MonthField tu definis une methode to_python() qui
renvoie un Month...

Le 6 juin 2009 14:49, Thomas Petazzoni<thomas.petazzoni _AT_ enix.org> a écrit :
> Le Sat, 6 Jun 2009 14:45:12 +0200,
> Jérémie Ducastel <jeremie _AT_ ducastel.name> a écrit :
>
>> je crois que le plus simple serait d'utiliser un SmallIntegerField en
>> definissant les paires de tuples valeur, nom.
>>
>> Ensuite tu fais appel à la methode get_FOO_display() pour afficher le
>> nom. Si le champ se nomme mois da
>
> Sauf que ce champ, je l'utilise plusieurs fois dans mon modèle. Et
> j'aimerais mieux ne pas avoir à définir plusieurs get_FOO_display().
> Mon but était de factoriser tout ça dans un champ générique (ici
> MonthField).
>
> Merci,
>
> Thomas
> --
> Thomas Petazzoni                         http://thomas.enix.org
> Promouvoir et défendre le Logiciel Libre http://www.april.org
> Logiciels Libres à Toulouse              http://www.toulibre.org
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

Pied de page des forums