Làm thế nào để lặp qua từ điển trong một từ điển trong mẫu django?


128

Từ điển của tôi trông như thế này (Từ điển trong một từ điển):

{'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'ss.sss@ssssss.com',
    'unit__name': u'Gram',
    'name': u'Rump Bone',
}}

Bây giờ tôi chỉ cố gắng hiển thị thông tin trên mẫu của mình nhưng tôi đang vật lộn. Mã của tôi cho mẫu trông như sau:

{% 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 %}

Nó chỉ hiển thị cho tôi '0' trên mẫu của tôi?

Tôi cũng đã thử:

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

Điều này thậm chí không hiển thị một kết quả.

Tôi nghĩ có lẽ tôi cần lặp lại một cấp độ sâu hơn nên đã thử điều này:

{% 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 %}

Nhưng điều này không hiển thị bất cứ điều gì.

Tôi đang làm gì sai?

Câu trả lời:


258

Hãy nói rằng dữ liệu của bạn là -

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

Bạn có thể sử dụng data.items()phương thức để lấy các phần tử từ điển. Lưu ý, trong các mẫu django chúng tôi KHÔNG đặt (). Ngoài ra một số người dùng được đề cập values[0]không hoạt động, nếu đó là trường hợp thì hãy thử 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>

Tôi khá chắc chắn rằng bạn có thể mở rộng logic này đến chính tả cụ thể của bạn.


Để lặp lại các khóa dict theo thứ tự được sắp xếp - Đầu tiên chúng ta sắp xếp theo python sau đó lặp lại & kết xuất trong mẫu django.

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

Trong tệp mẫu:

{% for key, value in data %}
    <tr>
        <td> Key: {{ key }} </td> 
        <td> Value: {{ value }} </td>
    </tr>
{% endfor %}

2
cảm ơn câu trả lời của bạn. Tôi có công thức_name tăng một cấp và không hiển thị cấp độ đó của từ điển. Cảm ơn bạn vì câu trả lời! Tôi không thể sử dụng values[0]thay vì tôi phảivalues.items
darren

mát mẻ! vui mừng chia sẻ những gì tôi biết. Mã đã được gõ tự do, vì vậy một số sai lầm là không thể tránh khỏi.
Srikar Appalaraju

1
Cảm ơn đã đề cập .items. Tài liệu https://docs.djangoproject.com/en/1.4/topics/templates/đưa ra một ví dụ không hoạt động, nhưng không có ví dụ nào hoạt động. {% for k,v in dict %}cho kết quả kỳ quái - k là ký tự đầu tiên của mọi khóa và v trống, trong khi {% for k in dict %}trả về khóa đầy đủ nhưng không có cách nào để truy xuất giá trị (vì dict.kcoi k là ký tự chữ).
Dave

2
Nâng cấp :-). Đối với những người đọc trong tương lai, các thẻ và bộ lọc tài https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#forliệu tham khảo này, cùng với các biến forloop có thể hữu ích khi định dạng danh sách.
Dave

1
values.items+1
Kevin_TA

3

Câu trả lời này không hiệu quả với tôi, nhưng tôi đã tự mình tìm thấy câu trả lời. Không ai, tuy nhiên, đã đăng câu hỏi của tôi. Tôi quá lười để hỏi nó và sau đó trả lời nó, vì vậy sẽ chỉ đặt nó ở đây.

Đây là truy vấn sau đây:

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

Trong mẫu:

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

0

Nếu bạn chuyển một biến data(loại từ điển) làm bối cảnh cho một mẫu, thì mã của bạn phải là:

{% for key, value in data.items %}
    <p>{{ key }} : {{ value }}</p> 
{% endfor %}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.