Bagaimana cara mengganti template admin (mis. Admin / index.html) sementara pada saat yang sama memperluasnya (lihat https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing -an-admin-template )?
Pertama - Saya tahu bahwa pertanyaan ini telah ditanyakan dan dijawab sebelumnya (lihat Django: Menimpa DAN memperluas templat aplikasi ) tetapi karena jawabannya mengatakan itu tidak berlaku langsung jika Anda menggunakan pemuat templat app_directories (yang merupakan sebagian besar waktu).
Solusi saya saat ini adalah membuat salinan dan memperluasnya alih-alih memperluas langsung dari templat admin. Ini berfungsi dengan baik tetapi sangat membingungkan dan menambahkan pekerjaan ekstra saat template admin berubah.
Itu bisa memikirkan beberapa ekstensi-tag khusus untuk template tetapi saya tidak ingin menemukan kembali roda jika sudah ada solusi.
Di samping catatan: Adakah yang tahu jika masalah ini akan ditangani oleh Django sendiri?
sumber
Jawaban:
Pembaruan :
Bacalah Docs untuk versi Django Anda. misalnya
https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding -template
Jawaban asli dari 2011:
Saya mengalami masalah yang sama sekitar satu setengah tahun yang lalu dan saya menemukan pemuat template yang bagus di djangosnippets.org yang membuatnya mudah. Ini memungkinkan Anda untuk memperluas template di aplikasi tertentu, memberi Anda kemampuan untuk membuat admin / index.html Anda sendiri yang memperluas template admin / index.html dari aplikasi admin. Seperti ini:
Saya telah memberikan contoh lengkap tentang cara menggunakan pemuat template ini dalam posting blog di situs web saya.
sumber
django-apptemplates
jika mungkin berhenti bekerja suatu hari nanti.Adapun Django 1.8 menjadi terbitan saat ini, tidak perlu symlink, salin admin / templates ke folder proyek Anda, atau instal middlewares seperti yang disarankan oleh jawaban di atas. Inilah yang harus dilakukan:
buat struktur pohon berikut (direkomendasikan oleh dokumentasi resmi )
Catatan : Lokasi file ini tidak penting. Anda dapat memasukkannya ke dalam aplikasi Anda dan itu akan tetap berfungsi. Asalkan lokasinya bisa ditemukan oleh django. Yang lebih penting adalah nama file HTML harus sama dengan nama file HTML asli yang diberikan oleh django.
Tambahkan jalur templat ini ke pengaturan Anda.py :
Identifikasi nama dan blokir yang ingin Anda timpa. Ini dilakukan dengan melihat ke dalam direktori admin / templates django. Saya menggunakan virtualenv, jadi bagi saya, jalurnya ada di sini:
Dalam contoh ini, saya ingin mengubah formulir tambah pengguna baru. Template responsiblve untuk tampilan ini adalah change_form.html . Buka change_form.html dan temukan {% block%} yang ingin Anda perpanjang.
Di change_form.html Anda , tulis sesuatu seperti ini:
Muat halaman Anda dan Anda akan melihat perubahannya
sumber
../
ke jalur "exetends" dan menentukan jalur asli yang lebih unik{% extends "../../admin/templates/admin/index.html" %}
. tautan ke jawabanjika Anda perlu menimpa
admin/index.html
, Anda dapat menyetel parameter index_template dariAdminSite
.misalnya
dan tempatkan template Anda
<appname>/templates/admin/my_custom_index.html
sumber
{% extends "admin/index.html" %}
dari my_custom_index.html dan memiliki referensi template admin django tanpa menyalinnya. Terima kasih.Dengan
django
1,5 (setidaknya) Anda dapat menentukan template yang ingin Anda gunakan untuk tertentumodeladmin
lihat https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options
Anda bisa melakukan sesuatu seperti
Dengan
change_form.html
ekstensi template html sederhanaadmin/change_form.html
(atau tidak jika Anda ingin melakukannya dari awal)sumber
Jawaban Chengs benar, namun menurut dokumen admin tidak setiap template admin dapat ditimpa dengan cara ini: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates
Saya harus menimpa login.html admin dan oleh karena itu harus meletakkan template yang ditimpa dalam struktur folder ini:
(tanpa subfolder myapp di admin) Saya tidak memiliki cukup reputasi untuk mengomentari posting Cheng, inilah mengapa saya harus menulis ini sebagai jawaban baru.
sumber
Cara terbaik untuk melakukannya adalah dengan meletakkan cetakan admin Django di dalam proyek Anda. Jadi cetakan anda akan berada di
templates/admin
sementara cetakan admin stok Django akan di katakantemplate/django_admin
. Kemudian, Anda dapat melakukan sesuatu seperti berikut:templates / admin / change_form.html
Jika Anda khawatir tentang memperbarui templat stok, Anda dapat memasukkannya dengan svn eksternal atau serupa.
sumber
--ignore
argumen denganmakemessages
. Lihat: docs.djangoproject.com/en/dev/ref/django-admin/#makemessagesSaya tidak dapat menemukan satu jawaban atau satu bagian dalam dokumen resmi Django yang memiliki semuanya informasi yang saya butuhkan untuk menimpa / memperluas templat admin default, jadi saya menulis jawaban ini sebagai panduan lengkap, berharap itu akan membantu untuk orang lain di masa depan.
Dengan asumsi struktur proyek Django standar:
Inilah yang perlu Anda lakukan:
Di
mysite/admin.py
, buat sub-kelas dariAdminSite
:Pastikan untuk mengimpor
custom_admin_site
diadmin.py
aplikasi Anda dan mendaftarkan model Anda di atasnya untuk menampilkannya di situs admin kustom Anda (jika Anda mau).Di
mysite/apps.py
, buat sub-kelas dariAdminConfig
dan seteldefault_site
keadmin.CustomAdminSite
dari langkah sebelumnya:Dalam
mysite/settings.py
, gantidjango.admin.site
diINSTALLED_APPS
denganapps.CustomAdminConfig
(Anda admin kustom aplikasi konfigurasi dari langkah sebelumnya).Masuk
mysite/urls.py
, gantiadmin.site.urls
dari URL admin menjadicustom_admin_site.urls
Buat templat yang ingin Anda ubah dalam
templates
direktori Anda , pertahankan struktur direktori templat admin Django default seperti yang ditentukan dalam dokumen . Misalnya, jika Anda memodifikasiadmin/index.html
, buat filetemplates/admin/index.html
.Semua templat yang ada dapat dimodifikasi dengan cara ini, dan nama serta strukturnya dapat ditemukan dalam kode sumber Django .
Sekarang Anda dapat mengganti template dengan menulisnya dari awal atau memperluasnya dan kemudian mengganti / memperluas blok tertentu.
Misalnya, jika Anda ingin menyimpan semuanya sebagaimana adanya tetapi ingin menimpa
content
blokir (yang di halaman indeks mencantumkan aplikasi dan modelnya yang Anda daftarkan), tambahkan yang berikut ini ketemplates/admin/index.html
:Untuk mempertahankan konten asli blok, tambahkan di
{{ block.super }}
mana pun Anda ingin konten asli ditampilkan:Anda juga dapat menambahkan gaya dan skrip kustom dengan memodifikasi blok
extrastyle
danextrahead
.sumber
Saya setuju dengan Chris Pratt. Tetapi saya pikir lebih baik membuat symlink ke folder Django asli dimana template admin ditempatkan di:
dan seperti yang Anda lihat itu tergantung pada versi python dan map tempat Django dipasang. Jadi di masa mendatang atau di server produksi, Anda mungkin perlu mengubah jalurnya.
sumber
IniSitus mempunyai solusi sederhana yang bekerja dengan konfigurasi Django 1.7 saya.
PERTAMA: Buatlah sebuah symlink bernama admin_src dalam direktori template / proyek Anda ke template Django yang Anda instal. Bagi saya di Dreamhost menggunakan virtualenv, templat admin Django "sumber" saya ada di:
KEDUA: Buat direktori admin di templates /
Jadi template / direktori proyek saya sekarang terlihat seperti ini:
KETIGA: Di direktori template / admin / baru Anda, buat file base.html dengan konten ini:
KEEMPAT: Tambahkan favicon-admin.ico admin Anda ke folder img root statis Anda.
Selesai. Mudah.
sumber
untuk indeks aplikasi, tambahkan baris ini ke file py umum seperti url.py
untuk indeks modul aplikasi: tambahkan baris ini ke admin.py
untuk daftar perubahan: tambahkan baris ini ke kelas admin:
untuk templat formulir modul aplikasi: tambahkan baris ini ke kelas admin Anda
dll. dan temukan yang lain di kelas modul admin yang sama
sumber
Anda bisa menggunakan django-overextends , yang menyediakan warisan templat melingkar untuk Django.
Itu berasal dari CMS Mezanin , dari mana Stephen mengekstraknya menjadi ekstensi Django mandiri.
Info selengkapnya yang Anda temukan di "Overriding vs Extending Templates" (http: /mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) di dalam dokumen Mezzanine.
Untuk bagian dalam yang lebih dalam, lihat Blog Stephens "Warisan Templat Edaran untuk Django" (http: /blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).
Dan di Google Grup, diskusi (https: /groups.google.com/forum / #! Topic / mezzanine-users / sUydcf_IZkQ) yang memulai pengembangan fitur ini.
catatan:
Saya tidak memiliki reputasi untuk menambahkan lebih dari 2 tautan. Tapi menurut saya tautannya memberikan informasi latar belakang yang menarik. Jadi saya hanya meninggalkan garis miring setelah "http (s):". Mungkin seseorang dengan reputasi yang lebih baik dapat memperbaiki tautan dan menghapus catatan ini.
sumber