Django管理员没有显示外键字段的选择

时间:2017-06-20 18:44:07

标签: python django django-models

我正在创建一个小型聊天应用,但由于字段Messagemie的{​​{1}}模型下拉,我在管理员中发送消息时遇到问题。请注意,在下图中,它未显示与chat模型关联的必需值。 Conversation模型中的conversation字段接受的值的格式为“number-number”,例如Conversation5-10等。请注意,我创建了一个未在下面显示的机制,它将这些输入格式转换为非Django管理输入的字符串(当用户开始新的对话时)。

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

chat

图片显示了admin

中的Messagemie模型@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") 字段选择

enter image description here

chat模型Django admin中输入值的图片。 enter image description here

1 个答案:

答案 0 :(得分:2)

Django admin在下拉列表中显示对象的字符串表示形式。这可以通过调用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