2012-12-03 40 views
5

Tôi đang cố gắng truy cập các thành phần của dict bằng các phím bắt đầu bằng ký tự gạch dưới. Ví dụ:Truy cập các phần tử dict có dấu gạch dưới hàng đầu trong Mẫu Django

my_dict = {"_source": 'xyz'}

Tôi đang cố gắng truy cập chúng trong mẫu Django. Rõ ràng tôi nhận ra rằng bạn không thể truy cập các biến python chưa được gạch từ một mẫu Django (vì chúng được coi là riêng tư trong Python) nhưng đây là đối tượng dict nơi bất kỳ đối tượng bất biến nào là khóa hợp lệ.

Tôi không thể truy cập vào dict ở trên trong mẫu Django bằng {{my_dict._source}} vì vậy tôi cho rằng Django đang ngăn chặn nó. Điều đó có chính xác không? Tôi là loại hy vọng Django làm một cái gì đó lành mạnh với các biến bắt đầu với gạch dưới như vẫn làm tra cứu dict (điều đầu tiên được cho là cố) nhưng từ chối thực hiện tra cứu thuộc tính, gọi phương thức và danh sách tra cứu chỉ mục từ biến tiền tố được nhấn mạnh sẽ không hợp lệ. Tôi nhanh chóng mất hy vọng mặc dù.

Để ghi lại, tôi biết ai đó sẽ đề nghị chỉ thay đổi dict nhưng đây thực sự là một từ điển đa cấp được trả về bởi thư viện rawes khi thực thi yêu cầu REST API trên cá thể ElasticSearch.

+0

Nếu đây thực sự là django bạn có thể tạo một mẫu tùy chỉnh thẻ để trả lại tin var. – Colleen

+0

tìm kiếm trên google "django template underscore vars" tiết lộ: https://groups.google.com/forum/?fromgroups=#!topic/django-users/J8c0j2_iEcc - tức là có, bạn sẽ cần phải tạo mẫu tùy chỉnh nhãn. Mặc dù thread này là cũ, tôi nghi ngờ rằng chức năng đã thay đổi. – Colleen

+0

Nó không phải là một var riêng tư, nó là một khóa dict pháp lý hoàn hảo, một cái gì đó mà nên được truy cập với một tra cứu dict. Thực sự cố gắng tránh tạo thẻ mẫu. Đặc biệt là kể từ khi các đối tượng dict có thể nhận được khá sâu như {{my_dict.hits._source._text}}. – rstuart85

Trả lời

11

The docs mention rằng bạn không thể có một khởi đầu biến với một dấu gạch dưới:

Tên biến phải bao gồm bất kỳ chữ cái (AZ), bất kỳ chữ số (0-9), một dấu gạch dưới (nhưng họ không được bắt đầu bằng dấu gạch dưới) hoặc dấu chấm.

nhưng bạn có thể dễ dàng viết một custom template filter để bắt chước get phương pháp của từ điển:

@register.filter(name='get') 
def get(d, k): 
    return d.get(k, None) 

{{ my_dict|get:"_my_key" }} 
+0

Cảm ơn bạn đã giải pháp! Tôi bắt đầu làm việc trên một gói để thu thập các bộ lọc gạch dưới hữu ích. Tôi đang nhắc đến bạn. https://github.com/halfnibble/django-underscore-filters –

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