Django-models外键对象显示字段名称而不是对象值

6

我在Django模型中使用名为Memberno的ForeignKey。在输入Members Class数据后,它会出现在其他类中的“memberno”字段中,显示为“member object”。我通过使用' raw_id_fields'来解决ForeignKey问题,但是对于普通字段甚至是“filter_horizontal”,每个memberno值都显示为“member object”。我希望这些值显示为它们在member class中的样子,即1, 2, ...

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)

需要对源代码进行格式化,以便使其易读。 - Jack M.
2个回答

7
管理员界面似乎使用__str__()来确定模型的显示。 我通常习惯在创建模型时同时定义__unicode__()__str__()。例如:
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)

更新:
看起来你的def __unicode__(self)在你的代码中没有正确缩进。因此它不是你的类的一部分,也没有被使用。在Python中缩进非常重要。


嗯,我在某个地方读到过,不建议使用def __str__,因为它可能会导致一些错误,从而导致Python崩溃。 - Dennis Kioko
如果我更改__str __()以返回“FindMe”,则它将显示在Activity对象列表中。如果我将__unicode__()更改为“FindMe”,则它将显示在下拉列表中,用于具有对ActivityForeignKey的其他对象。这可能不被鼓励,但它是有效的。 - Jack M.
我已经更改为def str(self): return "(%s)" % (self.memberno)但它仍然没有显示值。 - Dennis Kioko
我编辑了我的答案以反映缺少缩进。为了成为类的一部分,方法必须缩进到类的代码块中。你的 get_absolute_url 方法可能也会失败。 - Jack M.
我决定放弃这个类,转而使用Django内置的用户类。感谢您的帮助。 - Dennis Kioko

2
我不确定我完全理解你的问题,但是你是否为你的模型定义了一个unicode方法?unicode方法可以帮助你在模板中更好地呈现对象。请确保你的模型类包含该方法。

类事件(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)我的问题是,memeberno将显示“member Objects”,而不是实际对象,如“1”、“2”、“3”等。 - Dennis Kioko
在编程中,你需要为Members类定义一个 unicode(self) 方法。 - ayaz
已经有了class Members(models.Model): DESIGNATION_CHOICES=( ('ADM', '管理员'), ('OFF', '俱乐部官员'), ('MEM', '普通会员'), ) 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() .... image = models.ImageField(max_length=100,upload_to='photos/%Y/%m/%d', blank=True, null=True)def unicode(self): return u'%s %s %s' % (self.fname, self.sname, self.memberno) - Dennis Kioko
1
那个太难读了,你能把它放在你的问题里吗? - Jack M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接