2010-02-01 5 views
5

J'utilise une clé ForeignKey appelée Memberno dans les modèles My Django. Après avoir entré des données dans la classe Membres, il apparaît dans les autres classes comme "objet membre" dans le champ "memberno". Pour ForeignKey, j'utilise 'raw_id_fields' comme solution de contournement, mais pour les champs normaux et même 'filter_horizontal', chaque valeur de memberno est affichée comme "objet membre". Je voudrais que les valeurs apparaissent comme dans la classe membre à savoir 1, 2, ...Les objets Django-modèles ForeignKey affichent le nom du champ au lieu de l'objet Valeurs

from django.db import models 

# Create your models here. 
class Members(models.Model): 
    DESIGNATION_CHOICES=(
    ('ADM', 'Administrator'), 
    ('OFF', 'Club Official'), 
    ('MEM', 'Ordinary Member'), 
    ) 
    memberno = models.AutoField(primary_key=True) 
    fname = models.CharField(max_length=15) 
    sname = models.CharField(max_length=15) 
    onames = models.CharField(max_length=30, blank=True) 
    email = models.EmailField() 
    phoneNumber = models.CharField(max_length=15) 
    regNo = models.CharField(max_length=15) 
    designation = models.CharField(max_length=3,choices=DESIGNATION_CHOICES) 
    image = models.ImageField(max_length=100,upload_to='photos/%Y/%m/%d', blank=True, null=True) 
    course = models.CharField(max_length=30, blank=True, null=True) 


def __unicode__(self): 
    return u'%s %s %s' % (self.fname, self.sname, self.memberno) 


def get_absolute_url(self): 
    return '%s%s/%s' % (settings.MEDIA_URL, settings.ATTACHMENT_FOLDER, self.id) 

def get_download_url(self): 
    return '%s%s/%s' % (settings.MEDIA_URL, settings.ATTACHMENT_FOLDER, self.name) 




class Security(models.Model): 
    memberno = models.ForeignKey(Members, unique=True) 
    username = models.CharField(max_length=30, primary_key=True) 
    password = models.CharField(max_length=70) 

def __unicode__(self): 
    return u'%s %s %s' % (self.username, self.password, self.memberno) 


class Subscriptions(models.Model): 
    memberno = models.ForeignKey(Members) 
    receiptNo = models.CharField(max_length=30, primary_key=True) 
    type = models.CharField(max_length=50) 
    date = models.DateField() 
    amount = models.FloatField(max_length=99) 

def __unicode__(self): 
    return u'%s %s %s' % (self.receiptno, self.type, self.memberno) 




class events(models.Model): 
    eventName = models.CharField(max_length=25) 
    eventID = models.AutoField(primary_key=True) 
    details = models.TextField() 
    attendanceFee = models.FloatField(max_length=99) 
    date = models.DateField() 
    memberno = models.ManyToManyField(Members) 



def __unicode__(self): 
    return u'%s %s %s' % (self.eventName, self.eventID, self.memberno) 
+0

Vous devez formater le code source pour qu'il soit lisible. –

Répondre

4

L'interface d'administration semble utiliser __str__() pour déterminer l'affichage d'un modèle. Je fais un habbit pour toujours définir à la fois __unicode__() et __str__() lorsque je crée un modèle. Par exemple:

class Activity(models.Model): 
    activity_code = models.ForeignKey(ActivityCode) 
    note = models.TextField(blank=True) 
    def __str__(self): 
     return "(%s) %s" % (self.activity_code.short, self.note) 
    def __unicode__(self): 
     return u'(%s) %s' % (self.activity_code.short, self.note) 

Mise à jour:
Il semble que votre def __unicode__(self) n'est pas correctement en retrait dans votre code. Par conséquent, cela ne fait pas partie de votre classe et n'est pas utilisé. L'indentation est très importante en Python.

+0

Eh bien, j'ai lu quelque part que def __str__ est déconseillé car il peut résulter en quelques erreurs qui causent Python se bloquer –

+0

Eh bien, si je change '__str __()' pour retourner "FindMe", il apparaît dans la liste des 'Activity' objet. Si je change '__unicode __()' en "FindMe", il apparaît dans la liste déroulante pour les autres objets qui ont un 'ForeignKey' à' Activity'. Cela peut être découragé, mais cela fonctionne. –

+0

j'ai changé pour def __str __ (self): \t retour "(% s)" % (self.memberno) mais il ne montre pas encore les valeurs –

2

Je ne suis pas sûr que je comprends parfaitement votre question, mais avez-vous défini une méthode unicode pour vos modèles?

+0

événements de classe (models.Model): \t eventName = models.CharField (max_length = 25) \t eventID = models.AutoField (PRIMARY_KEY = true) \t détails = models.TextField() \t attendanceFee = models.FloatField (longueur_max = 99) \t date = models.DateField() \t memberno = models.ManyToManyField (abonnés) def __unicode __ (self): \t retour u '% s% s% s' % (self.eventName, self .eventID, self.memberno) \t Mon pro blem est que memeberno affichera des "objets membres" à la place de chaque objet à la place des objets réels comme "1", "2", "3" etc. –

+0

gramware, vous devrez définir une méthode 'unicode (self)' pour la classe 'Members'. – ayaz

+0

ses déjà là Les membres de la classe (models.Model): \t DESIGNATION_CHOICES = ( \t ('ADM', 'Administrateur'), ​​ \t ('OFF', 'officiel du Club'), \t ('MEM' , 'membre ordinaire'), \t) \t memberno = models.AutoField (primary_key = True) \t FNAME = models.CharField (max_length = 15) \t sname = models.CharField (max_length = 15) \t ONAMES = models.CharField (longueur_max = 30, vide = Vrai) \t email = models.EmailField() .... \t image = models.ImageField (longueur_max = 100, upload_to = 'photos /% Y /% m /% d', blanc = True, null = True) \t def __unicode __ (auto): \t Renvoie '% s% s% s'% (self.fname, self.symmet, self.memberno) –

Questions connexes