Django“ xxxxxx Object” แสดงการปรับแต่งในแถบด้านข้างการดำเนินการของผู้ดูแลระบบ


110

ฉันต้องการเปลี่ยนพฤติกรรมเริ่มต้นของการเปลี่ยนแปลงล่าสุดของผู้ดูแลระบบแถบด้านข้างแสดงชื่อของ "วัตถุ" ที่เพิ่มเข้ามา ดูภาพด้านล่าง:

ในโมดูลการดำเนินการล่าสุดยังแสดงวัตถุใหม่เป็น "วัตถุ MyModelName"

ฉันต้องการเปลี่ยนวิธีการตั้งชื่อใน Admin ตามหลักการแล้วฉันต้องการที่จะเปลี่ยนจาก "MyModelName object" เป็นในตัวอย่างออบเจ็กต์ "Policy" เช่น "Policy: {{value of the policy's" Policy Name "}}

ฉันคิดว่า__unicode__สำหรับแบบจำลองผู้ป่วยของฉันจัดการสิ่งนี้ แต่ดูเหมือนจะไม่ ขอขอบคุณความช่วยเหลือใด ๆ


1
__unicode__ทำอย่างนั้น วางรหัสของคุณเพื่อให้เราเห็นว่ามีอะไรผิดพลาด
dan-klasson

__unicode__ไม่ได้ผลสำหรับฉันใน Python 3 อย่างไรก็ตาม__str__ทำงานตามที่ระบุไว้ในคำตอบด้านล่าง
Dan King

คำตอบ:


168

__unicode__ทำอย่างนั้น โมเดลของคุณควรมีลักษณะดังนี้:

class SomeModel(models.Model):
    def __unicode__(self):
       return 'Policy: ' + self.name

ใน Python 3 คุณต้องใช้__str__:

def __str__(self):
   return 'Policy: ' + self.name

1
ฉันไม่ได้สังเกตอย่างโง่เขลาว่าฉันได้ประกาศวิธีการ Unicode สำหรับทุกรุ่นยกเว้นวิธีนี้ : doh: ขอโทษทุกคน
patrickn

29

การใช้__str__วิธีนี้ใช้ได้กับ Python3 และ Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)

3
สิ่งนี้แก้ไขให้ฉันเช่นกัน ฉันยังใช้ Python3 และ Django1.8
Teodor Scorpan

strเป็นวิธีเก่า ..... แต่ python 3 กับ Django วิธีใหม่ ( unicode ) ใช้ไม่ได้?
user798719

13

สตริงที่คุณเห็นนั้นมาจาก__unicode__วิธีการตามที่คนอื่นพูดถึง แต่สิ่งนี้ก็คือผู้ดูแลระบบจะบันทึกการแสดงสตริงของวัตถุเมื่อสร้างเหตุการณ์บันทึกดังนั้นหากคุณเพิ่ม__unicode__การใช้งานหลังจากบันทึกรายการบันทึกแล้วคุณจะไม่เห็นชื่อเรื่องใหม่ในรายการเก่าหลังจากที่คุณทำกิจกรรมใหม่แล้วเท่านั้น


ฉันแค่สงสัยว่าทำไมบันทึกการดำเนินการไม่ปรากฏชื่อหลังจากที่ฉันตั้งค่าUnicode - ฉันควรทราบว่ามันเป็นเพียงบันทึกที่เก็บไว้ในฐานข้อมูลที่รับข้อมูลในเวลาที่สร้าง!
markwalker_

2
ขอบคุณจะทำให้ฉันยุ่งยากมากถ้าคุณไม่ได้อธิบายเรื่องนั้น
dtc

7

คำตอบที่กล่าวถึง__str__และ__unicode__วิธีการถูกต้อง ตามที่ระบุไว้ในเอกสารอย่างไรก็ตามตั้งแต่เวอร์ชัน 1.6 (ฉันคิดว่า) คุณสามารถใช้python_2_unicode_compatibleมัณฑนากรสำหรับทั้ง Python 2 และ Python 3:

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(models.Model):
    def __str__(self):
        return "Instance of my class"

คุณสามารถใช้ข้างต้นในสิ่งที่ไม่ใช่Modelวัตถุได้เช่นกัน


3

คุณต้องกำหนดคอลัมน์ใดที่คุณต้องการแสดง ...

ตัวอย่างเช่น:

class POAdmin(admin.ModelAdmin):
    list_display = ('qty', 'cost', 'total')

2

คุณคิดถูกแล้วที่คิด__unicode__อย่างนั้น ฉันมีสิ่งนี้กำลังทำงานอยู่:

class Film(models.Model):
    title = models.CharField(max_length=200)
    ...
    def __unicode__(self):
        return self.title

เมื่อฉันดูรายการการกระทำล่าสุดฉันเห็นชื่อของภาพยนตร์ที่ฉันเพิ่งแก้ไข


2

วิธีนี้ใช้ได้ผลโดยใช้ def str (self): ซึ่งส่งคืน self.title

ใช้สิ่งที่ชอบ:

class Blog(models.Model):
    title = models.CharField(max_length=200)
    def __str__(self):
        return self.title

1

ตั้งแต่คำถามนี้อายุ 6 ขวบหลายสิ่งหลายอย่างเปลี่ยนไป ให้ฉันอัปเดตด้วย python3.6 และ Django เวอร์ชันล่าสุด (2.1.2) คุณควรใช้__str__()ในโค้ดใหม่เสมอ __unicode__()เป็นเรื่องเก่าสำหรับ python2.7 เพราะใน python3 strคือunicode.


0

การเพิ่ม __str__()วิธีการให้กับโมเดลPatientด้วยวิธีนี้:

class Patient(models.Model):
name=models.CharField(max_length=200)
#.........
def __str__(self):
    return self.name

จะแสดงชื่อของผู้ป่วยแทนวัตถุ ตรวจสอบรายละเอียดได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.