2010-05-24 51 views
41

Tôi muốn sử dụng biến làm khóa trong từ điển trong mẫu Django. Tôi không thể cho cuộc sống của tôi tìm ra cách để làm điều đó. Nếu tôi có một sản phẩm có tên hoặc ID lĩnh vực, và xếp hạng từ điển với chỉ số ID sản phẩm, tôi muốn để có thể nói:Sử dụng biến làm khóa từ điển trong mẫu Django

{% for product in product_list %} 
    <h1>{{ ratings.product.id }}</h1> 
{% endfor %} 

Trong python này sẽ được thực hiện với một đơn giản

ratings[product.id] 

Nhưng tôi không thể làm cho nó hoạt động trong các mẫu. Tôi đã thử sử dụng ... không có súc sắc. Ý tưởng?

+0

bản sao có thể có của [cách truy cập phần tử từ điển trong mẫu django?] (Http://stackoverflow.com/questions/1275735/how-to-access-dictionary-element-in-django-template) – Anto

Trả lời

16

Bạn cần chuẩn bị dữ liệu của bạn trước, trong trường hợp này bạn nên vượt qua danh sách hai tuples cho mẫu của bạn:

{% for product, rating in product_list %} 
    <h1>{{ product.name }}</h1><p>{{ rating }}</p> 
{% endfor %} 
+0

Cảm ơn cji! Tôi đã cố gắng tránh một vật thể khác, nhưng nó không thực sự quan trọng ... tất cả đều được lưu trong bộ nhớ cache. – CaptainThrowup

+1

Bạn không cần phải chuẩn bị dữ liệu trong chế độ xem, bạn có thể đạt được điều tương tự bằng cách gọi 'các mục' trên từ điển đã có trong ngữ cảnh -' {% cho sản phẩm, xếp hạng trong product_list.items%} 'sẽ công việc. – jhrr

72

Tạo một mẫu thẻ như thế này (trong yourproject/templatetags):

@register.filter 
def keyvalue(dict, key):  
    return dict[key] 

Cách sử dụng:

{{dictionary|keyvalue:key_variable}} 
+2

Bạn cũng cần một loạt các công cụ ngoại vi để thực hiện công việc này để đảm bảo bạn kiểm tra tài liệu: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ –

+1

Điều này có thể được xích cho nested dicts? Một cái gì đó như '{{dictionary | keyvalue: key_variable | keyvalue: another_key}}'? –

+0

Về mặt lý thuyết có, hãy dùng thử;) – eviltnan

12

có một rất bẩn Giải pháp:

<div>We need d[{{ k }}]</div> 

<div>So here it is: 
{% for key, value in d.items %} 
    {% if k == key %} 
     {{ value }} 
    {% endif %} 
{% endfor %} 
</div> 
7

Xây dựng về câu trả lời của eviltnan, bộ lọc của mình sẽ nâng cao một ngoại lệ nếu key không phải là một chìa khóa của dict.

Bộ lọc không bao giờ nên ngoại lệ, nhưng phải là fail gracefully. Đây là một/hoàn thành câu trả lời mạnh mẽ hơn:

@register.filter 
def keyvalue(dict, key):  
    try: 
     return dict[key] 
    except KeyError: 
     return '' 

Về cơ bản, điều này sẽ làm tương tự như dict.get(key, '') trong mã Python, và cũng có thể được viết theo cách đó nếu bạn không muốn bao gồm các thử/trừ khối, mặc dù nó rõ ràng hơn.

+9

thay vì dict [key] bạn chỉ cần sử dụng từ điển python tích hợp sẵn. ví dụ: return dict.get (key, '') – user772401

Các vấn đề liên quan