2017-06-20 163 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

很高興能幫到你! –