mydict = {"key1":"value1", "key2":"value2"}
Dengan cara biasa untuk mencari nilai kamus di template Django adalah {{ mydict.key1 }}
, {{ mydict.key2 }}
. Bagaimana jika kuncinya adalah variabel loop? yaitu:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME
gagal Bagaimana cara memperbaikinya?
Ambil kunci dan nilai dari kamus di loop:
Saya menemukan ini lebih mudah dibaca dan menghindari perlunya pengkodean khusus. Saya biasanya membutuhkan kunci dan nilai di dalam loop.
sumber
Anda tidak dapat secara default. Titik adalah pemisah / pemicu untuk pencarian atribut / pencarian kunci / slice.
Tetapi Anda bisa membuat filter yang memungkinkan Anda menyampaikan argumen:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
sumber
return value.get(arg)
karena itu tidak akan membuang pengecualian KeyError jika kunci tidak ada.Bagi saya membuat file python bernama
template_filters.py
di App saya dengan konten di bawah melakukan pekerjaanpenggunaan seperti apa yang dikatakan culebrón:
sumber
register = Library()
? Apa fungsinya?django.template.base.Library
kelas. olehregister = Library()
kami instantiate kelas itu dan menggunakanfilter
fungsi annotator di dalamnya untuk mencapai kebutuhan kita.Saya memiliki situasi yang serupa. Namun saya menggunakan solusi yang berbeda.
Dalam model saya, saya membuat properti yang melakukan pencarian kamus. Di template saya kemudian menggunakan properti.
Dalam model saya: -
Dalam templat saya: -
sumber
Karena saya tidak dapat berkomentar, izinkan saya melakukan ini dalam bentuk jawaban:
untuk membangun di atas jawaban culebrón atau jawaban Yuji 'Tomita' Tomita , kamus yang dialihkan ke fungsi adalah dalam bentuk string, jadi mungkin gunakan ast. literal_eval untuk mengonversi string ke kamus terlebih dahulu, seperti dalam contoh ini .
Dengan pengeditan ini, kode akan terlihat seperti ini:
sumber
Lingkungan: Django 2.2
Saya memasukkan kode ini ke file bernama template_filters.py di folder proyek saya bernama portfoliomgr
Di mana pun Anda meletakkan kode filter, pastikan Anda memiliki __init__.py di folder itu
Tambahkan file itu ke bagian perpustakaan di bagian template di file projectfolder / settings.py Anda. Bagi saya, ini adalah portfoliomgr / settings.py
Dalam kode html Anda memuat perpustakaan
sumber
env: Django 2.1.7
melihat:
templat:
sumber
{{ dict_obj.obj.obj_name }}
dalam hal ini setara dengan kode Pythondict_obj["obj"]["obj_name"]
, namun pertanyaannya adalah tentang yang setara dengandict_obj[obj][obj_name]
.