2017-06-20 60 views
0

我创建一个小的聊天应用程序,我必须在管理员制作,因为下拉为Messagemie模型场chat的消息问题的选择。请注意,下图中没有显示与Conversation型号相关的所需值。 Conversation模型中的conversation字段所接受的值是“number-number”的形式,例如, 5-1011-21等。注意,我已经创建未如下所示的转换这样的输入格式非Django管理输入字符串(当用户启动一个新的会话)的机制。Django管理不显示为外键字段

conversation字段是CharField类型。我怀疑为什么Django管理员表单不显示所需的值是因为field类型,但我不确定。也可能是因为Django管理员没有将输入转换为字符串,因此在下拉菜单中只显示Conversation object。为什么Django管理员不会为chat输入字段显示正确的值?

@python_2_unicode_compatible 
class Conversation(models.Model): 
    conversation = models.CharField(unique=True, max_length=150) 
    email_1 = models.ForeignKey(Usermie, to_field="email", related_name="email_1_convo") 
    email_2 = models.ForeignKey(Usermie, to_field="email", related_name="email_2_convo") 



@python_2_unicode_compatible 
class Messagemie(models.Model): 
    sender = models.ForeignKey(Usermie, to_field="email", related_name="email_sender") 
    receiver = models.ForeignKey(Usermie, to_field="email", related_name="email_receiver") 
    # The username is the sender's username 
    sender_username = models.CharField(max_length=50) 
    receiver_username = models.CharField(max_length=50) 
    message = models.TextField() 
    chat = models.ForeignKey(Conversation, to_field="conversation", related_name="conversation_chat") 

图片表示Messagemie模型chat场选择在管理员输入值的

enter image description here

图片在Conversation模型Django管理。 enter image description here

回答

2

Django管理显示在下拉的对象的字符串表示。这可以通过致电str(object)获得。您可以通过覆盖类中的__str__方法来修改此行为。

Django的基础模型类(django.db.models.Model)的实施有一个执行像下面(的python3) -

def __str__(self): 
    return str('%s object' % self.__class__.__name__) 

这也解释了你所看到的。 self.__class__.__name__评估为"Conversation",因此您最终会在下拉列表中看到"Conversation object"

要更改此行为,可以覆盖__str__方法以获取所需的返回值。下面是一个示例实现。您可以轻松修改该方法以包含任何您想要的逻辑。

class Conversation(models.Model): 
    conversation = models.CharField(unique=True, max_length=150) 
    email_1 = models.ForeignKey(Usermie, to_field="email", 
           related_name="email_1_convo") 
    email_2 = models.ForeignKey(Usermie, to_field="email", 
           related_name="email_2_convo") 

    def __str__(self): 
     return self.conversation 
+0

非常感谢您的回答!你的回答也回答下一个问题。我使用奇怪为什么人们使用'__str__'方法,当你可以使用任何方法并输出你想要的任何东西作为简单地使用'%s'时。非常感谢! – Jam1

+0

很高兴能帮到你! –