【问题标题】:Django admin not showing choices for Foreign key fieldDjango 管理员没有显示外键字段的选择
【发布时间】:2017-06-20 18:44:06
【问题描述】:

我正在创建一个小型聊天应用程序,但由于字段 chatMessagemie 模型的下拉列表,我无法在管理员中发送消息。请注意,在下图中,它没有显示与 Conversation 模型关联的所需值。 Conversation 模型中的 conversation 字段接受的值是“数字-数字”形式,例如5-1011-21 等。请注意,我创建了一个未在下面显示的机制,它将此类输入格式转换为非 Django 管理员输入的字符串(当用户开始新对话时)。

conversation 字段的类型为 CharField。我怀疑 Django 管理表单未显示所需值的原因是因为 field 类型,但我不确定。也可能是因为 Django 管理员没有将输入转换为字符串,因此在下拉菜单中只显示Conversation object。为什么 Django admin 没有为 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 模型 chatadmin 中的字段选择

Conversation 模型 Django 管理员中的输入值图片。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    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
    

    【讨论】:

    • 非常感谢您的回答!您的回答也回答了下一个问题。我曾经想知道为什么人们使用__str__ 方法,当您可以使用任何方法并简单地使用%s 输出任何您想要的作为刺痛时。非常感谢!
    • 很高兴能帮上忙!
    猜你喜欢
    • 2012-09-19
    • 2016-06-20
    • 1970-01-01
    • 2023-02-19
    • 2014-12-01
    • 2021-12-29
    • 2015-06-17
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多