Tùy chỉnh hiển thị Django “xxxxxx Object” trong thanh bên hành động quản trị


110

Tôi muốn thay đổi hành vi mặc định của cách quản trị viên thay đổi thanh bên hiển thị tên của "đối tượng" được thêm vào. Tham khảo hình bên dưới:

Trong mô-đun hành động gần đây, nó cũng hiển thị các đối tượng mới là "đối tượng MyModelName"

Tôi muốn thay đổi cách đặt tên chúng trong Quản trị viên. Tốt nhất, tôi muốn có thể thay đổi nó từ "đối tượng MyModelName" thành, như trong ví dụ về đối tượng "Chính sách", chẳng hạn như "Chính sách: {{giá trị của trường" Tên chính sách "của chính sách.}}.

Tôi đã nghĩ rằng __unicode__đối với mô hình Bệnh nhân của tôi đã xử lý được điều này, nhưng có vẻ như không. Mọi sự trợ giúp đều được đánh giá cao.


1
__unicode__làm điều đó. Dán mã của bạn vì vậy chúng tôi có thể xem những gì là sai
dan-Klasson

__unicode__không làm việc cho tôi trong Python 3. Tuy nhiên, __str__đã làm việc như tài liệu trong các câu trả lời dưới đây
Dan vua

Câu trả lời:


168

__unicode__làm điều đó. Mô hình của bạn sẽ trông giống như sau:

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

Trên Python 3, bạn cần sử dụng __str__:

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

1
Tôi đã ngu ngốc không nhận thấy rằng tôi đã khai báo các phương thức unicode cho mọi mô hình NGOẠI TRỪ mô hình này. : doh: Xin lỗi tất cả.
Patrickn

29

Sử dụng __str__phương thức hoạt động trên Python3 và Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

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

3
Điều này cũng giải quyết cho tôi. Tôi cũng sử dụng Python3 và Django1.8.
Teodor Scorpan

str là cách cũ ..... nhưng python 3 với Django, cách mới ( unicode ) không hoạt động?
user798719

13

Chuỗi mà bạn thấy là đến từ __unicode__phương thức, như những người khác đã đề cập. Nhưng vấn đề là quản trị viên lưu biểu diễn chuỗi của một đối tượng khi nó tạo sự kiện nhật ký, do đó nếu bạn thêm __unicode__triển khai sau khi mục nhật ký được lưu, bạn sẽ không thấy tiêu đề mới trên các mục cũ, chỉ sau khi bạn thực hiện một số hoạt động mới


Tôi chỉ tự hỏi tại sao nhật ký Hành động không hiển thị tên sau khi tôi đặt unicode - tôi nên biết rằng đó chỉ là một nhật ký được lưu trữ trong db lấy dữ liệu tại thời điểm tạo!
markwalker_

2
cảm ơn bạn, tôi sẽ gặp rắc rối lớn nếu bạn không giải thích điều đó
dtc

7

Các câu trả lời đề cập __str____unicode__phương pháp là chính xác. Tuy nhiên, như đã nêu trong tài liệu , kể từ phiên bản 1.6 (tôi nghĩ), bạn có thể sử dụng trình python_2_unicode_compatibletrang trí cho cả Python 2 và 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"

Bạn cũng có thể sử dụng ở trên trong các Modelđối tượng không phải .


3

Bạn cần xác định, cột nào bạn muốn hiển thị ...

ví dụ:

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

2

Bạn đúng khi nghĩ rằng __unicode__làm điều đó. Tôi có cái này đang chạy ngay bây giờ:

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

Khi tôi xem trong danh sách các hành động gần đây, tôi thấy tiêu đề của bộ phim mà tôi vừa chỉnh sửa.


2

Điều này sẽ hoạt động, sử dụng def str (self): trả về self.title

Sử dụng một cái gì đó như:

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

1

Kể từ khi câu hỏi này được 6 năm, rất nhiều thứ đã thay đổi. Hãy để tôi cập nhật nó. Với python3.6 và phiên bản mới nhất của Django (2.1.2), bạn nên luôn sử dụng __str__()trong mã mới. __unicode__()là một câu chuyện cũ cho python2.7 vì trong python3, strunicode.


0

Bằng cách thêm __str__()phương thức vào mô hình Patienttheo cách này:

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

sẽ hiển thị tên của bệnh nhân thay vì đối tượng. Kiểm tra chi tiết tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.