Bisakah Anda memberi aplikasi Django nama verbose untuk digunakan di seluruh admin?
140
Dengan cara yang sama Anda bisa memberikan bidang dan memodelkan nama verbose yang muncul di admin Django, dapatkah Anda memberi nama kustom pada aplikasi?
Tiket ini akan membahas ini: code.djangoproject.com/ticket/3591 . Sayangnya, itu tidak tampak seperti itu akan diintegrasikan ke dalam Django dalam waktu dekat ...
Aplikasi baru harus dihindari default_app_config. Sebagai gantinya mereka harus meminta jalur bertitik ke AppConfigsubkelas yang sesuai untuk dikonfigurasikan secara eksplisit di INSTALLED_APPS.
# in yourapp/apps.pyfrom django.apps importAppConfigclassYourAppConfig(AppConfig):
name ='yourapp'
verbose_name ='Fancy Title'
kemudian atur default_app_configvariabel keYourAppConfig
# in yourapp/__init__.py
default_app_config ='yourapp.apps.YourAppConfig'
Sebelum ke Django 1.7
Anda dapat memberi nama kustom aplikasi Anda dengan mendefinisikan app_label dalam definisi model Anda. Tetapi ketika Django membangun halaman admin, model hash akan ditampilkan oleh app_label mereka, jadi jika Anda ingin mereka muncul dalam satu aplikasi, Anda harus mendefinisikan nama ini di semua model aplikasi Anda.
Saya mengalami masalah dengan ini di admin. Sangat tergantung pada app_label sehingga ketika saya mulai mengubah nama, itu memecahkan hal itu.
Joe J
Saya tahu, saya akhirnya menulis templatag yang memiliki dict dengan app_url: app_name binding.
Frost.baka
58
Catatan, ini BUKAN sama dengan nama verbose, dalam arti bahwa itu hanya mempengaruhi apa yang ditampilkan kepada pengguna. Ini string literal yang digunakan untuk memberi nama tabel dalam database, yang membutuhkan migrasi skema jika Anda mengubah model yang ada.
Cerin
6
Saya rasa ini bukan solusi yang baik. Ini memiliki terlalu banyak efek samping lain yang tidak estetika.
David Sanders
Jawaban populer ini merekomendasikan penggunaan hack / solusi yang diperlukan sebelum Django 1.7. Jika Anda menggunakan 1,7 atau lebih, gunakan file apps.py seperti yang direkomendasikan di bawah ini oleh iMaGiNiX.
shacker
38
Seperti yang dinyatakan oleh komentar rhunwicks ke OP, ini sekarang mungkin di luar kotak sejak Django 1.7
Ini bekerja dengan baik, tetapi kode dalam file init .py tidak diperlukan jika Anda menginstal aplikasi sebagai contoh rekomendasi Django di INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís
31
Jika Anda memiliki lebih dari satu model dalam aplikasi, buat saja model dengan informasi Meta dan buat subkelas dari kelas itu untuk semua model Anda.
classMyAppModel(models.Model):classMeta:
app_label ='My App Label'
abstract =TrueclassCategory(MyAppModel):
name = models.CharField(max_length=50)
Jangan terlalu berharap. Anda juga perlu menyalin tampilan indeks dari django.contrib.admin.sites ke dalam tampilan ProjectAdminSite Anda sendiri dan memasukkannya dalam instance admin kustom Anda sendiri:
Yah saya memulai aplikasi yang disebut todo dan sekarang memutuskan saya ingin itu diberi nama Tugas . Masalahnya adalah bahwa saya sudah memiliki data di dalam tabel saya sehingga pekerjaan saya adalah sebagai berikut. Ditempatkan ke dalam models.py:
Untuk Django 1.4 (belum dirilis, tetapi trunk cukup stabil), Anda dapat menggunakan metode berikut. Itu bergantung pada fakta bahwa AdminSite sekarang mengembalikan TemplateResponse, yang dapat Anda ubah sebelum diberikan.
Di sini, kami melakukan sedikit tambalan monyet untuk menyisipkan perilaku kami, yang dapat dihindari jika Anda menggunakan subkelas AdminSite khusus.
from functools import wraps
def rename_app_list(func):
m ={'Sites':'Web sites','Your_app_label':'Nicer app label',}@wraps(func)def _wrapper(*args,**kwargs):
response = func(*args,**kwargs)
app_list = response.context_data.get('app_list')if app_list isnotNone:for a in app_list:
name = a['name']
a['name']= m.get(name, name)
title = response.context_data.get('title')if title isnotNone:
app_label = title.split(' ')[0]if app_label in m:
response.context_data['title']="%s administration"% m[app_label]return response
return _wrapper
admin.site.__class__.index = rename_app_list(admin.site.__class__.index)
admin.site.__class__.app_index = rename_app_list(admin.site.__class__.app_index)
Ini memperbaiki indeks dan tampilan app_index. Itu tidak memperbaiki remah roti di semua tampilan admin lainnya.
Hanya beberapa catatan samping yang bagus: membuat file bernama apps.pytidak wajib. Nama apa pun baik-baik saja (tetapi Anda harus merujuknya __init__.py). Seperti yang telah dinyatakan dalam komentar lain, kode ini berfungsi untuk django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ).
Furins
Ini bekerja dengan baik, tetapi kode dalam file init .py tidak diperlukan jika Anda menginstal aplikasi sebagai contoh rekomendasi Django di INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís
6
Tidak, tetapi Anda dapat menyalin template admin dan menentukan nama aplikasi di sana.
Anda memiliki verbose_name, namun Anda juga ingin menyesuaikan app_label untuk tampilan yang berbeda di admin. Sayangnya memiliki beberapa string arbitrer (dengan spasi) tidak berfungsi dan itu bukan untuk tampilan.
Ternyata admin menggunakan app_label. title () untuk tampilan sehingga kita dapat membuat sedikit hack: str subclass dengan metode title overriden:
classStuff(models.Model):classMeta:
app_label = string_with_title("stuffapp","The stuff box")# 'stuffapp' is the name of the django app
verbose_name ='The stuff'
verbose_name_plural ='The bunch of stuff'
dan admin akan menampilkan "Kotak barang" sebagai nama aplikasi.
Jika Anda sudah memiliki tabel yang ada menggunakan nama aplikasi lama, dan Anda tidak ingin memigrasikannya, maka atur app_label pada proksi model asli.
Perlu diketahui bahwa url akan menjadi / admin / NewAPPname / mynewmodel / jadi Anda mungkin hanya ingin memastikan bahwa nama kelas untuk model baru terlihat sedekat mungkin dengan model lama.
Potongan kode plug-and-play berikut berfungsi dengan baik sejak itu Django 1.7. Yang harus Anda lakukan adalah menyalin kode di bawah ini dalam __init__.pyfile aplikasi tertentu dan mengubah VERBOSE_APP_NAMEparameternya.
from os import path
from django.apps importAppConfig
VERBOSE_APP_NAME ="YOUR VERBOSE APP NAME HERE"def get_current_app_name(file):return path.dirname(file).replace('\\','/').split('/')[-1]classAppVerboseNameConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = VERBOSE_APP_NAME
default_app_config = get_current_app_name(__file__)+'.__init__.AppVerboseNameConfig'
Jika Anda menggunakan ini untuk beberapa aplikasi, Anda harus memfaktorkan get_current_app_namefungsi tersebut ke file pembantu.
Jawaban:
Django 1.8+
Per 1,8 dokumen (dan dokumen saat ini ),
Contoh:
Kemudian ubah
AppConfig
seperti yang tercantum di bawah ini.Django 1.7
Seperti yang dinyatakan oleh komentar rhunwicks ke OP, ini sekarang mungkin di luar kotak sejak Django 1.7
Diambil dari dokumen :
kemudian atur
default_app_config
variabel keYourAppConfig
Sebelum ke Django 1.7
Anda dapat memberi nama kustom aplikasi Anda dengan mendefinisikan app_label dalam definisi model Anda. Tetapi ketika Django membangun halaman admin, model hash akan ditampilkan oleh app_label mereka, jadi jika Anda ingin mereka muncul dalam satu aplikasi, Anda harus mendefinisikan nama ini di semua model aplikasi Anda.
sumber
Seperti yang dinyatakan oleh komentar rhunwicks ke OP, ini sekarang mungkin di luar kotak sejak Django 1.7
Diambil dari dokumen :
kemudian atur
default_app_config
variabel keYourAppConfig
sumber
Jika Anda memiliki lebih dari satu model dalam aplikasi, buat saja model dengan informasi Meta dan buat subkelas dari kelas itu untuk semua model Anda.
sumber
Beri mereka properti verbose_name.
Jangan terlalu berharap. Anda juga perlu menyalin tampilan indeks dari django.contrib.admin.sites ke dalam tampilan ProjectAdminSite Anda sendiri dan memasukkannya dalam instance admin kustom Anda sendiri:
kemudian atur tampilan yang disalin sehingga menggunakan properti verbose_name Anda sebagai label untuk aplikasi.
Saya melakukannya dengan menambahkan sesuatu seperti ini ke tampilan yang disalin:
Saat Anda mengubah tampilan indeks mengapa tidak menambahkan properti 'pesanan' juga.
sumber
Yah saya memulai aplikasi yang disebut todo dan sekarang memutuskan saya ingin itu diberi nama Tugas . Masalahnya adalah bahwa saya sudah memiliki data di dalam tabel saya sehingga pekerjaan saya adalah sebagai berikut. Ditempatkan ke dalam models.py:
Semoga ini bisa membantu.
sumber
Untuk Django 1.4 (belum dirilis, tetapi trunk cukup stabil), Anda dapat menggunakan metode berikut. Itu bergantung pada fakta bahwa AdminSite sekarang mengembalikan TemplateResponse, yang dapat Anda ubah sebelum diberikan.
Di sini, kami melakukan sedikit tambalan monyet untuk menyisipkan perilaku kami, yang dapat dihindari jika Anda menggunakan subkelas AdminSite khusus.
Ini memperbaiki indeks dan tampilan app_index. Itu tidak memperbaiki remah roti di semua tampilan admin lainnya.
sumber
Pertama, Anda perlu membuat
apps.py
file seperti ini di appfolder Anda:Untuk memuat subkelas AppConfig ini secara default:
Apakah cara terbaik untuk melakukannya. diuji pada Django 1.7
Untuk orang yang memiliki masalah dengan bahasa Spanyol
Kode ini mengaktifkan kompatibilitas utf-8 pada skrip python2
sumber
apps.py
tidak wajib. Nama apa pun baik-baik saja (tetapi Anda harus merujuknya__init__.py
). Seperti yang telah dinyatakan dalam komentar lain, kode ini berfungsi untuk django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ).Tidak, tetapi Anda dapat menyalin template admin dan menentukan nama aplikasi di sana.
sumber
Ada peretasan yang bisa dilakukan yang tidak memerlukan migrasi apa pun. Diambil dari blog Ionel dan penghargaan diberikan kepadanya: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
Ada juga tiket untuk ini yang harus diperbaiki di Django 1.7 https://code.djangoproject.com/ticket/3591
"" "
Misalkan Anda memiliki model seperti ini:
Anda memiliki verbose_name, namun Anda juga ingin menyesuaikan app_label untuk tampilan yang berbeda di admin. Sayangnya memiliki beberapa string arbitrer (dengan spasi) tidak berfungsi dan itu bukan untuk tampilan.
Ternyata admin menggunakan app_label. title () untuk tampilan sehingga kita dapat membuat sedikit hack: str subclass dengan metode title overriden:
Sekarang kita dapat memiliki model seperti ini:
dan admin akan menampilkan "Kotak barang" sebagai nama aplikasi.
"" "
sumber
Jika Anda sudah memiliki tabel yang ada menggunakan nama aplikasi lama, dan Anda tidak ingin memigrasikannya, maka atur app_label pada proksi model asli.
Maka Anda hanya perlu mengubah ini di admin.py Anda:
Perlu diketahui bahwa url akan menjadi / admin / NewAPPname / mynewmodel / jadi Anda mungkin hanya ingin memastikan bahwa nama kelas untuk model baru terlihat sedekat mungkin dengan model lama.
sumber
Ya, ini bekerja untuk saya. Di app.py gunakan ini:
Di setting.py tambahkan nama App dan nama kelas yang ada di file app.py di folder App
]
sumber
Potongan kode plug-and-play berikut berfungsi dengan baik sejak itu
Django 1.7
. Yang harus Anda lakukan adalah menyalin kode di bawah ini dalam__init__.py
file aplikasi tertentu dan mengubahVERBOSE_APP_NAME
parameternya.Jika Anda menggunakan ini untuk beberapa aplikasi, Anda harus memfaktorkan
get_current_app_name
fungsi tersebut ke file pembantu.sumber