我正在创建一个小型聊天应用,但由于字段Messagemie
的{{1}}模型下拉,我在管理员中发送消息时遇到问题。请注意,在下图中,它未显示与chat
模型关联的必需值。 Conversation
模型中的conversation
字段接受的值的格式为“number-number”,例如Conversation
,5-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")
字段选择
答案 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