bagaimana cara beralih melalui kamus dalam kamus di templat Django?

128

Kamus saya terlihat seperti ini (Kamus dalam kamus):

{'0': {
    'chosen_unit': <Unit: Kg>,
    'cost': Decimal('10.0000'),
    'unit__name_abbrev': u'G',
    'supplier__supplier': u"Steve's Meat Locker",
    'price': Decimal('5.00'),
    'supplier__address': u'No\r\naddress here',
    'chosen_unit_amount': u'2',
    'city__name': u'Joburg, Central',
    'supplier__phone_number': u'02299944444',
    'supplier__website': None,
    'supplier__price_list': u'',
    'supplier__email': u'[email protected]',
    'unit__name': u'Gram',
    'name': u'Rump Bone',
}}

Sekarang saya hanya mencoba untuk menampilkan informasi pada template saya tetapi saya kesulitan. Kode saya untuk template terlihat seperti:

{% if landing_dict.ingredients %}
  <hr>
  {% for ingredient in landing_dict.ingredients %}
    {{ ingredient }}
  {% endfor %}
  <a href="/">Print {{ landing_dict.recipe_name }}</a>
{% else %}
  Please search for an ingredient below
{% endif %}

Itu hanya menunjukkan saya '0' pada template saya?

Saya juga mencoba:

{% for ingredient in landing_dict.ingredients %}
  {{ ingredient.cost }}
{% endfor %}

Ini bahkan tidak menampilkan hasil.

Saya pikir mungkin saya perlu mengulanginya satu tingkat lebih dalam sehingga mencoba ini:

{% if landing_dict.ingredients %}
  <hr>
  {% for ingredient in landing_dict.ingredients %}
    {% for field in ingredient %}
      {{ field }}
    {% endfor %}
  {% endfor %}
  <a href="/">Print {{ landing_dict.recipe_name }}</a>
{% else %}
  Please search for an ingredient below
{% endif %}

Tapi ini tidak menampilkan apa pun.

Apa yang saya lakukan salah?

darren
sumber

Jawaban:

258

Katakanlah data Anda adalah -

data = {'a': [ [1, 2] ], 'b': [ [3, 4] ],'c':[ [5,6]] }

Anda dapat menggunakan data.items()metode ini untuk mendapatkan elemen kamus. Catatan, dalam templat Django, kami TIDAK menaruh (). Juga beberapa pengguna yang disebutkan values[0]tidak bekerja, jika itu masalahnya maka cobalah values.items.

<table>
    <tr>
        <td>a</td>
        <td>b</td>
        <td>c</td>
    </tr>

    {% for key, values in data.items %}
    <tr>
        <td>{{key}}</td>
        {% for v in values[0] %}
        <td>{{v}}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</table>

Saya cukup yakin Anda dapat memperluas logika ini ke dict khusus Anda.


Untuk beralih lebih dari kunci dikt dalam urutan diurutkan - Pertama kita mengurutkan dalam python kemudian iterate & render dalam template Django.

return render_to_response('some_page.html', {'data': sorted(data.items())})

Dalam file template:

{% for key, value in data %}
    <tr>
        <td> Key: {{ key }} </td> 
        <td> Value: {{ value }} </td>
    </tr>
{% endfor %}
Srikar Appalaraju
sumber
2
Terima kasih atas jawaban anda. Saya telah recipe_name naik satu tingkat dan tidak menunjukkan tingkat kamus itu. Terima kasih atas jawaban Anda! Saya tidak bisa menggunakan values[0]sebagai gantinya saya harusvalues.items
darren
keren! senang berbagi apa yang saya tahu. Kode diketik dengan tangan bebas, sehingga beberapa kesalahan tidak dapat dihindari.
Srikar Appalaraju
1
Terima kasih telah menyebutkan .items. Dokumentasi https://docs.djangoproject.com/en/1.4/topics/templates/memberikan contoh yang tidak berfungsi, tetapi tidak ada contoh yang berfungsi. {% for k,v in dict %}memberikan hasil yang aneh - k adalah karakter pertama dari setiap kunci dan v kosong, sementara {% for k in dict %}mengembalikan kunci penuh tetapi tanpa cara untuk mengambil nilai (karena dict.kmemperlakukan k sebagai karakter literal).
Dave
2
Diperbaharui :-). Untuk pembaca masa depan, tag dan filter referensi https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#fordokumen ini, bersama dengan variabel forloop yang dapat membantu saat memformat daftar.
Dave
1
values.items+1
Kevin_TA
3

Jawaban ini tidak berhasil untuk saya, tetapi saya menemukan jawabannya sendiri. Namun, tidak ada yang memposting pertanyaan saya. Saya terlalu malas untuk bertanya dan kemudian menjawabnya, jadi taruh saja di sini.

Ini untuk kueri berikut:

data = Leaderboard.objects.filter(id=custom_user.id).values(
    'value1',
    'value2',
    'value3')

Dalam template:

{% for dictionary in data %}
  {% for key, value in dictionary.items %}
    <p>{{ key }} : {{ value }}</p>
  {% endfor %}
{% endfor %}
crappy_hacker
sumber
0

Jika Anda meneruskan variabel data(jenis kamus) sebagai konteks ke templat, maka kode Anda harus:

{% for key, value in data.items %}
    <p>{{ key }} : {{ value }}</p> 
{% endfor %}
Eugene Chabanov
sumber