Django-fr

Forum

#1 04-10-2011 18:46:10

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

Valeurs par défaut / héritage

Hello,

je voudrais savoir comment mettre une valeur par défaut à un champ hérité.

class Type(models.Model):
    name = models.CharField(max_length=200)
   
    def __unicode__(self):
        return self.name
   
class Item(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    type = models.ForeignKey(Type)
    actions = models.ManyToManyField(Action,blank=True)
    quality = models.IntegerField()
    item_requirements = models.ManyToManyField('self',blank=True)
    points = models.IntegerField()
   
    def __unicode__(self):
        return self.name

class Food(Item):
    ap = models.IntegerField()
   
class Tool(Item):
    durability = models.IntegerField()


je souhaite pouvoir set le champ type de chaque classe en fonction de son nom. Pour être parfaitement clair, si la classe s'appelle Food, son champ type sera égal à "Food".

Hors ligne

#2 04-10-2011 20:24:36

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : Valeurs par défaut / héritage

Le 04/10/2011 19:46, kyrillos a écrit :
> Hello,
>
> je voudrais savoir comment mettre une valeur par défaut à un champ
> hérité.
>
> class Type(models.Model):
>      name = models.CharField(max_length=200)
>
>      def __unicode__(self):
>          return self.name
>
> class Item(models.Model):
>      name = models.CharField(max_length=200)
>      description = models.CharField(max_length=200)
>      type = models.ForeignKey(Type)
>      actions = models.ManyToManyField(Action,blank=True)
>      quality = models.IntegerField()
>      item_requirements = models.ManyToManyField('self',blank=True)
>      points = models.IntegerField()
>
>      def __unicode__(self):
>          return self.name
>
> class Food(Item):
>      ap = models.IntegerField()
>
> class Tool(Item):
>      durability = models.IntegerField()
>
>
> je souhaite pouvoir set le champ type de chaque classe en fonction de son
> nom. Pour être parfaitement clair, si la classe s'appelle Food, son champ
> type sera égal à "Food".
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Bonsoir,

Tes classes hérites de la classe Item qui a un champ type comme
ForeignKey vers Type. Ton champ type sera donc toujours un objet Type.
En gros tu veux plutôt pouvoir initialiser Food.type.name et comme ta
class Type a pour unicode self.name, si tu tapes Food.type après avoir
attribué une valeur à son nom, tu obtiendra le nom.

Donc pour se faire, il te faudrait créer un nouvel objet type dans la
base pour chacune de tes classes. Cela me semble un peu biscournu.

A quoi te sert ta class Type? Elle n'a qu'un seul champ name.
Pourquoi ne pas créer un champ type dans ta classe item et ensuite
surcharger la méthode save()  de Item?

    class Item(models.Model):
        name = models.CharField(max_length=200)
        description = models.CharField(max_length=200)
        type = models.CharField(max_length=200, null=True)

        def __unicode__(self):
            return self.name
        def save(self):
            self.type = self.__class__.__name__
            super(Item,self).save()

    class Food(Item):
        ap = models.IntegerField()



    class Tool(Item):
        durability = models.IntegerField()


Je viens de tester et cela marche très bien. Tu n'as plus qu'à redéfinir
ton modelAdmin pour ne pas afficher type dans le formulaire de création.

Hors ligne

#3 05-10-2011 09:28:14

Tarek Ziadé
Membre
Inscription : 11-08-2010
Messages : 12

Re : Valeurs par défaut / héritage

2011/10/5 BILLION Sébastien <sebastien.billion _AT_ gmail.com>:
> C'est quoi le délire avec ce topic?

Du spam genere avec un truc de traduc un peu pourri smile
>
>
> BILLION Sébastien
>
> the Answer to the ultimate question of life, the universe and everything is
> 42
>
> http://www.sebastienbillion.com/
> Le 05/10/2011 03:49, Clareersofe a écrit :
>
> Hello,
>
> je voudrais savoir comment mettre une valeur par défaut à un champ
> hérité.
>
> class Type(models.Model):
>     name = models.CharField(max_length=200)
>
>     def __unicode__(self):
>         return self.name
>
> class Item(models.Model):
>     name = models.CharField(max_length=200)
>     description = models.CharField(max_length=200)
>     type = models.ForeignKey(Type)
>     actions = models.ManyToManyField(Action,blank=True)
>     quality = models.IntegerField()
>     item_requirements = models.ManyToManyField('self',blank=True)
>     points = models.IntegerField()
>
>     def __unicode__(self):
>         return self.name
>
> class Food(Item):
>     ap = models.IntegerField()
>
> class Tool(Item):
>     durability = models.IntegerField()
>
>
> je souhaite pouvoir set le champ type de chaque classe en fonction de son
> nom. Pour être parfaitement clair, si la classe s'appelle Food, son champ
> type sera égal à "Food".
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 07-10-2011 09:44:56

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

Re : Valeurs par défaut / héritage

je n'ai pas compris l'histoire du spam, mais bref, seb, ton idée est bien cependant, le nom de la classe ne me va pas, je veux pouvoir choisir une autre chaine de caractère (ici la traduction en français). j'imagine que je peux surcharger la méthode save dans chaque sous classes ?

Hors ligne

#5 07-10-2011 10:17:18

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : Valeurs par défaut / héritage

Salut,

Je pensais que tu voulais que le champ type de Food soit égale à "Food".
J'ai du mal comprendre.
Bien entendu tu peux surcharger save() dans chaque classe.
Tu peux aussi voir du côté de l'internationalisation... Ainsi tu ne
surcharge que la méthode save() de item et tu traduit juste les
différents nom de classe en Français.

https://docs.djangoproject.com/en/dev/topics/i18n/internationalization/#standard-translation

A toi de voir.

Cordialement,

BILLION Sébastien

the Answer to the ultimate question of life, the universe and everything
is 42

http://www.sebastienbillion.com/ <http://www.sebastienbillion.com/>

Le 07/10/2011 10:44, kyrillos a écrit :
> je n'ai pas compris l'histoire du spam, mais bref, seb, ton idée est bien
> cependant, le nom de la classe ne me va pas, je veux pouvoir choisir une
> autre chaine de caractère (ici la traduction en français). j'imagine que
> je peux surcharger la méthode save dans chaque sous classes ?
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#6 07-10-2011 11:51:02

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

Re : Valeurs par défaut / héritage

Ouais, je pense que je vais aller voir du coté de l'internationnalisation, merci pour ton aide !

Hors ligne

#7 07-10-2011 12:42:00

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

Re : Valeurs par défaut / héritage

dernière question, peut-on se contenter d'utiliser les fonctionnalités de base de Django ou faut-il utiliser un plugin pour l'internationalisation du contenu dynamique ?

Hors ligne

#8 07-10-2011 13:15:27

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : Valeurs par défaut / héritage

Je ne me souviens pas d'un quelconque plugin à installer. Mais ça fait
longtemps que je n'en ai pas mis en place.


BILLION Sébastien

the Answer to the ultimate question of life, the universe and everything
is 42

http://www.sebastienbillion.com/ <http://www.sebastienbillion.com/>

Le 07/10/2011 13:42, kyrillos a écrit :
> dernière question, peut-on se contenter d'utiliser les fonctionnalités de
> base de Django ou faut-il utiliser un plugin pour l'internationalisation du
> contenu dynamique ?
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums