Saya memiliki beberapa hal di settings.py yang ingin saya akses dari templat, tetapi saya tidak tahu cara melakukannya. Saya sudah mencoba
{{CONSTANT_NAME}}
tapi itu sepertinya tidak berhasil. Apakah ini mungkin?
django
django-templates
django-settings
Paul Wicks
sumber
sumber
Jawaban:
Django menyediakan akses ke konstanta pengaturan tertentu yang sering digunakan untuk template seperti
settings.MEDIA_URL
dan beberapa pengaturan bahasa jika Anda menggunakan Django bawaan dalam pandangan umum atau meneruskan dalam konteks contoh kata kunci argumen dalamrender_to_response
fungsi pintas. Berikut ini adalah contoh dari setiap kasus:Tampilan ini akan memiliki beberapa pengaturan yang sering digunakan seperti
settings.MEDIA_URL
tersedia untuk template seperti{{ MEDIA_URL }}
, dll.Jika Anda mencari akses ke konstanta lain di pengaturan, maka cukup buka konstanta yang Anda inginkan dan tambahkan mereka ke kamus konteks yang Anda gunakan dalam fungsi tampilan Anda, seperti:
Sekarang Anda dapat mengakses
settings.FAVORITE_COLOR
pada templat Anda sebagai{{ favorite_color }}
.sumber
django-settings-export
untuk menghindari kebutuhan untuk menulis kode ini di setiap tampilan.Jika itu nilai yang ingin Anda miliki untuk setiap permintaan & templat, menggunakan pengolah konteks lebih tepat.
Begini caranya:
Buat
context_processors.py
file di direktori aplikasi Anda. Katakanlah saya ingin memilikiADMIN_PREFIX_VALUE
nilai dalam setiap konteks:tambahkan pemroses konteks Anda ke file settings.py Anda :
Gunakan
RequestContext
dalam tampilan Anda untuk menambahkan pemroses konteks Anda dalam templat Anda. Cararender
pintas melakukan ini secara otomatis:dan akhirnya, di templat Anda:
sumber
context_process.py
tepat di sebelahsettings.py
file saya dan ditambahkan"context_processors.admin_media"
keTEMPLATE_CONTEXT_PROCESSORS
daftar saya . Juga, Anda mungkin ingin menambahkan catatan dalam jawaban Anda tentang fakta bahwa nilai default TEMPLATE_CONTEXT_PROCESSORS tidak kosong, jadi jika ada kode yang menggunakan nilai apa pun yang ditetapkan oleh pengolah konteks default, mereka tidak akan berfungsi kecuali jika Anda menambahkannya kembali ke daftar secara eksplisit.render
pintasan untuk menghindari keharusan secara eksplisit menyertakan RequestContext: docs.djangoproject.com/en/1.6/topics/http/shortcuts/#renderSaya menemukan pendekatan paling sederhana menjadi tag templat tunggal :
Pemakaian:
sumber
{% settings_value "DATABASES" %}
:? Kasing ini harus menjelaskan mengapa pengaturan tidak tersedia di template untuk memulai.templatetags
folder di dalam aplikasi Anda dengan__init__.py
file kosong dan kode ini sebagaisettings.py
di dalam folder itu. 2) di templat yang Anda tambahkan{% load settings %}
dan gunakan tag baru Anda!Lihat
django-settings-export
(penafian: Saya penulis proyek ini).Sebagai contoh...
settings.py
template.html
sumber
render
dan tidakrender_to_response
Cara lain untuk melakukan ini adalah dengan membuat tag templat kustom yang dapat membuat Anda mendapatkan nilai dari pengaturan.
Anda kemudian dapat menggunakan:
untuk mencetaknya di halaman mana saja, tanpa melewati konteks-prosesor lingkaran.
sumber
Saya suka solusi Berislav, karena di situs sederhana, ini bersih dan efektif. Apa yang saya TIDAK suka adalah mengekspos semua konstanta pengaturan mau tak mau. Jadi yang akhirnya saya lakukan adalah ini:
Pemakaian:
Ini melindungi konstanta yang belum Anda sebutkan namanya untuk digunakan dalam template, dan jika Anda ingin benar-benar mewah, Anda bisa mengatur tuple di pengaturan, dan membuat lebih dari satu tag template untuk halaman, aplikasi atau area yang berbeda, dan cukup menggabungkan tuple lokal dengan tuple pengaturan sesuai kebutuhan, kemudian lakukan pemahaman daftar untuk melihat apakah nilainya dapat diterima.
Saya setuju, di situs yang kompleks, ini agak sederhana, tetapi ada nilai-nilai yang akan menyenangkan untuk dimiliki secara universal di templat, dan ini tampaknya berfungsi dengan baik. Terima kasih kepada Berislav untuk ide aslinya!
sumber
if name in ALLOWABLE_VALUES: ...
'val' in ('val_first', 'second_val',)
adalahFalse
, tidak ada substring masalah di sini.if
pernyataan? saya ingin memeriksaDEBUG
nilainyaSaya sedikit memperbaiki jawaban chrisdew (untuk membuat tag Anda sendiri).
Pertama, buat file
yourapp/templatetags/value_from_settings.py
tempat Anda mendefinisikan tag baru Anda sendirivalue_from_settings
:Anda dapat menggunakan tag ini di Templat Anda melalui:
atau via
Keuntungan dari
as ...
notasi adalah ini membuatnya mudah digunakan dalamblocktrans
blok melalui sederhana{{my_fqdn}}
.sumber
Menambahkan jawaban dengan instruksi lengkap untuk membuat tag templat kustom yang menyelesaikan ini, dengan Django 2.0+
Di folder aplikasi Anda, buat folder bernama templatetags . Di dalamnya, buat __init__.py dan custom_tags.py :
Di custom_tags.py buat fungsi tag khusus yang menyediakan akses ke kunci sewenang-wenang di konstanta pengaturan :
Untuk memahami kode ini saya sarankan membaca bagian tentang tag sederhana di dokumen Django.
Kemudian, Anda perlu membuat Django mengetahui tag kustom ini (dan tambahan apa pun) dengan memuat file ini dalam templat apa pun di mana Anda akan menggunakannya. Sama seperti Anda perlu memuat tag statis bawaan:
Dengan itu dimuat dapat digunakan sama seperti tag lain, cukup berikan pengaturan khusus yang Anda butuhkan kembali. Jadi, jika Anda memiliki variabel BUILD_VERSION di pengaturan Anda:
Solusi ini tidak akan bekerja dengan array, tetapi jika Anda perlu, Anda mungkin menempatkan banyak logika di template Anda.
Catatan: Solusi yang lebih bersih dan gagal mungkin akan membuat pengolah konteks khusus tempat Anda menambahkan pengaturan yang Anda perlukan ke konteks yang tersedia untuk semua templat. Dengan cara ini Anda mengurangi risiko menghasilkan pengaturan sensitif dalam template Anda secara tidak sengaja.
sumber
Tambahkan kode ini ke file bernama
context_processors.py
:Dan kemudian, dalam file pengaturan Anda, sertakan jalur seperti
'speedy.core.base.context_processors.settings'
(dengan nama aplikasi dan jalur Anda) dalam'context_processors'
pengaturan diTEMPLATES
.(Anda dapat melihat misalnya pengaturan / base.py dan context_processors.py ).
Kemudian Anda dapat menggunakan pengaturan khusus dalam kode template apa pun. Sebagai contoh:
Pembaruan: Kode di atas memperlihatkan semua pengaturan ke template, termasuk informasi sensitif seperti Anda
SECRET_KEY
. Seorang hacker mungkin menyalahgunakan fitur ini untuk menampilkan informasi seperti itu di template. Jika Anda hanya ingin mengekspos pengaturan spesifik ke template, gunakan kode ini sebagai gantinya:sumber
SECRET_KEY
. Seorang hacker mungkin menyalahgunakan fitur ini untuk menampilkan informasi seperti itu di templat.Contoh di atas dari bchhun bagus kecuali bahwa Anda perlu membangun kamus konteks Anda secara eksplisit dari settings.py. Di bawah ini adalah contoh TERTULIS tentang bagaimana Anda dapat membangun-otomatis kamus konteks dari semua atribut huruf besar dari settings.py (re: "^ [A-Z0-9 _] + $").
Di akhir settings.py:
sumber
Jika seseorang menemukan pertanyaan ini seperti yang saya lakukan, maka saya akan memposting solusi saya yang berfungsi pada Django 2.0:
Tag ini memberikan beberapa nilai variabel settings.py ke variabel templat:
Pemakaian:
{% get_settings_value template_var "SETTINGS_VAR" %}
app / templatetags / my_custom_tags.py:
Template Anda:
Lihat dokumentasi Django cara membuat tag templat khusus di sini: https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
sumber
{% if settings_debug %}
{% if settings_debug == True %}
sesuai saran Anda{% if settings_debug %}
Jika menggunakan tampilan berbasis kelas:
sumber
Saya menemukan ini menjadi pendekatan paling sederhana untuk Django 1.3:
views.py
hero.html
sumber
IanSR dan bchhun menyarankan untuk mengganti TEMPLATE_CONTEXT_PROCESSORS di pengaturan. Perlu diketahui bahwa pengaturan ini memiliki standar yang dapat menyebabkan beberapa hal kacau jika Anda menimpanya tanpa mengatur ulang default. Defaultnya juga telah berubah di versi terbaru Django.
https://docs.djangoproject.com/en/1.3/ref/settings/#template-context-processors
TEMPLATE_CONTEXT_PROCESSORS default:
sumber
Jika kita membandingkan tag konteks vs template pada satu variabel, maka mengetahui opsi yang lebih efisien bisa jadi buatan. Namun, Anda mungkin lebih baik mencelupkan ke pengaturan hanya dari template yang membutuhkan variabel itu. Dalam hal ini, tidak masuk akal untuk meneruskan variabel ke semua templat. Tetapi jika Anda mengirim variabel ke templat umum seperti templat base.html, Maka itu tidak masalah karena templat base.html diberikan pada setiap permintaan, sehingga Anda dapat menggunakan salah satu metode.
Jika Anda memutuskan untuk pergi dengan opsi tag template, maka gunakan kode berikut karena memungkinkan Anda untuk melewati default nilai , kalau-kalau variabel yang dipertanyakan tidak ditentukan.
Contoh: get_from_settings my_variable sebagai my_context_value
Contoh: get_from_settings my_variable my_default sebagai my_context_value
sumber
SITE_EXTRA_CONTEXT_DICT
di finalware untuk melakukannya untuk Anda.