Django "Objek xxxxxx" menampilkan kustomisasi di bilah sisi tindakan admin

110

Saya ingin mengubah perilaku default bagaimana admin bar samping perubahan terbaru menampilkan nama "objek" yang ditambahkan. Lihat gambar di bawah ini:

Dalam modul tindakan terbaru, ini juga menampilkan objek baru sebagai "objek MyModelName"

Saya ingin mengubah bagaimana ini dinamai di Admin. Idealnya, saya ingin bisa mengubahnya dari "objek MyModelName" menjadi, seperti dalam contoh objek "Kebijakan", sesuatu seperti "Kebijakan: {{nilai bidang" Nama Kebijakan "kebijakan.}}.

Saya berpikir __unicode__untuk model Pasien saya yang menangani ini, tetapi tampaknya tidak. Bantuan apa pun dihargai.

patrickn
sumber
1
__unicode__melakukan itu. Rekatkan kode Anda sehingga kami dapat melihat apa yang salah
dan-klasson
__unicode__tidak berhasil untuk saya dengan Python 3. Namun, __str__berhasil seperti yang didokumentasikan dalam jawaban di bawah
Dan King

Jawaban:

168

__unicode__melakukan itu. Model Anda akan terlihat seperti ini:

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

Di Python 3, Anda perlu menggunakan __str__:

def __str__(self):
   return 'Policy: ' + self.name
dan-klasson
sumber
1
Dengan bodohnya saya tidak menyadari bahwa saya telah mendeklarasikan metode unicode untuk setiap model KECUALI yang ini. : doh: Maaf semuanya.
patrickn
29

Menggunakan __str__metode bekerja pada Python3 dan Django1.8:

class MyModel(models.Model):

    name = models.CharField(max_length=60)

    def __str__(self):
        return 'MyModel: {}'.format(self.name)
Aditya Kresna Permana
sumber
3
Ini menyelesaikannya untuk saya juga. Saya juga menggunakan Python3 dan Django1.8.
Teodor Scorpan
str adalah cara lama ..... namun python 3 dengan Django, cara baru ( unicode ) tidak berfungsi?
pengguna798719
13

String yang Anda lihat berasal dari __unicode__metode, seperti yang disebutkan orang lain. Tetapi masalahnya adalah admin menyimpan representasi string dari suatu objek ketika membuat peristiwa log, oleh karena itu jika Anda menambahkan __unicode__implementasi setelah entri log disimpan, Anda tidak akan melihat judul baru pada item lama, hanya setelah Anda membuat beberapa aktivitas baru

Dmitry Shevchenko
sumber
Saya hanya bertanya-tanya mengapa log Tindakan tidak menampilkan nama setelah saya menyetel unicode - saya harus tahu itu hanya log yang disimpan dalam data pengambilan db pada saat pembuatan!
markwalker_
2
terima kasih, akan merepotkan saya jika Anda tidak menjelaskannya
dtc
7

Jawaban yang disebutkan __str__dan __unicode__metode sudah benar. Seperti yang tercantum dalam dokumen Namun, sejak versi 1.6 (saya pikir), Anda dapat menggunakan python_2_unicode_compatibledekorator untuk kedua Python 2 dan 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"

Anda juga dapat menggunakan yang di atas pada non- Modelobjek.

alxs
sumber
3

Anda perlu menentukan, kolom mana yang ingin Anda tampilkan ...

sebagai contoh:

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

Anda benar dalam berpikir bahwa __unicode__melakukan itu. Saya sedang menjalankan ini sekarang:

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

Ketika saya melihat di daftar aksi terbaru, saya melihat judul film yang baru saja saya edit.

Andrew Barrett
sumber
2

Ini akan berhasil, menggunakan def str (self): yang mengembalikan self.title

Gunakan sesuatu seperti:

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

Sejak pertanyaan ini berumur 6 tahun, banyak hal telah berubah. Biarkan saya memperbaruinya. Dengan python3.6 dan versi terbaru Django (2.1.2) Anda harus selalu menggunakan __str__()kode baru. __unicode__()adalah cerita lama untuk python2.7 karena di python3, stradalah unicode.

cgsdfc.dll
sumber
0

Dengan menambahkan __str__()metode ke model Patientseperti ini:

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

akan menampilkan nama pasien, bukan objek. Untuk detailnya periksa di sini

Ishwor Khanal
sumber