2012-01-20 38 views
18

Tôi có một số vòng lặp trên trang và cần mục danh sách tùy thuộc vào số vòng lặp.Nhận mục danh sách động trong các mẫu django

Khi tôi gọi:

{{ mylist.1 }} 
{{ mylist.2 }} 
{{ mylist.3 }} 

tất cả hoạt động tốt nhưng những gì tôi thực sự cần là một cái gì đó như:

{% for x in somenumber|MyCustomRangeTag %} 
    {{ mylist.x }} 
{% endfor %} 

MyCustomRangeTag mang lại cho tôi Python range() nó hoạt động và tôi đã có x như số. Vì vậy, x là 1, 2, 3, vv tùy thuộc vào số vòng lặp. Điều này có thể thực hiện được không?

+0

bạn có thể chuyển các giá trị bạn cần trong chế độ xem không? nếu bạn biết phạm vi trước khi tay tại sao không chỉ vượt qua các giá trị chính xác bạn đang cố gắng để hiển thị? – dm03514

+0

Không, tôi không thể trong trường hợp này. Đó là trang giỏ hàng tùy chỉnh được mã hóa cứng và tất cả điều này là một phần của một số biểu mẫu lồng nhau. – Goran

Trả lời

25

Điều này không thể trực tiếp vì Django cho rằng "x" là chìa khóa để tra cứu trong mylist - thay vì giá trị của x. Vì vậy, khi x = 5, Django cố gắng tìm kiếm mylist["x"] thay vì mylist[5].

Sử dụng các bộ lọc sau khi workaround:

@register.filter 
def lookup(d, key): 
    return d[key] 

và sử dụng nó như

{{ mylist|lookup:x }} 
+2

Điều gì sẽ xảy ra nếu đầu ra của '{{mylist | lookup: x}}' là một đối tượng và tôi cần truy cập cái gì khác? Một cái gì đó như 'mylist.1.first_name' – zengr

+2

@zengr Hãy thử' {% với lookup_result = mylist | tra cứu: x%} {{lookup_result.first_name}} {% endwith%} '. – valid

3

Bạn có chắc chắn bạn không thể chỉ làm:

{% for item in mylist %} 
    {{ item }} 
{% endfor %} 

Với bộ lọc lát, bạn thậm chí có thể làm một số tùy biến.

+0

Tôi nghĩ bạn muốn có '{{item}}' trên dòng thứ hai. Nó cũng đáng chú ý ở đây là bạn có thể sử dụng '{{forloop.counter}}' trong vòng lặp nếu bạn cần một chỉ mục vì một lý do nào đó. – aganders3

+0

Haha, đừng lo. Cảm ơn các mẹo mặc dù. Tôi thực sự không bị đe dọa bởi đại diện của bạn, tôi chỉ quên chúng tôi có thể chỉnh sửa câu trả lời. Điều này sẽ truyền cảm hứng cho tôi khi tôi cảm thấy nhút nhát trong tương lai. – aganders3

6

Tôi nhận thấy rằng @ e-satis đề cập đến nó, nhưng tôi nghĩ rằng các built-in lát mẫu thẻ xứng đáng một số tình yêu.

{{ item | slice:"2" }} #gets the third element of the list 
+0

điều này có thể đã làm việc trước đây nhưng đã cho một số kết quả funky khi tôi đã cho nó một shot với django 1,5 – Alvin

+0

Điều này đã không làm việc cho tôi, nhưng '{{some_list | slice:": 2 "}}' đã làm các trick --https : //docs.djangoproject.com/en/1.7/ref/templates/builtins/#slice – Hayden

+0

@Hayden Tôi tin rằng chỉ nhận được hai yếu tố đầu tiên của danh sách? Tôi đã cập nhật mã để sửa cú pháp bộ lọc. –

4

Thẻ slice trong mẫu Django có thể sử dụng mã cắt của python, nhưng cú pháp không khác gì một cách khác biệt. Ví dụ, nếu bạn muốn để có được một phần tử của một chuỗi với một biến, trong python bạn muốn viết một cái gì đó tương tự như sau:

>>>mylist = ["0th Element", "1th Element"] 
>>>zero, one = 0, 1 
>>>mylist[zero] 
"0th Element" 
>>>mylist[one] 
"1th Element" 

Sử dụng cú pháp này với Django lát mẫu thẻ sẽ trả về một danh sách cắt lát trong mọi trường hợp, các tiện ích đáng ngờ để nhận một mục của chỉ số nổi tiếng:

{% with "0" as zero %} 
{% with "1" as one %} 
{% with "2" as two %} 

{{mylist|slice:zero}} {{mylist|slice:one}} {{mylist|slice:two}} 

{% endwith %} 
{% endwith %} 
{% endwith %} 

ám vào html:

[] ["0th Element"] ["0th Element", "1th Element"] 

Lưu ý sự khác biệt: bạn đang nhận lại sult của mylist[:x] thay vì mylist[x].

Django cung cấp đủ công cụ để giải quyết vấn đề này. Bí quyết đầu tiên là sử dụng các lát rõ ràng như 0:1 cho các chỉ mục của bạn và sau đó |join:"" danh sách kết quả thành một phần tử duy nhất.Cũng giống như vậy:

{% with "0:1" as zero %} 
{{mylist|slice:zero|join:""}} 
{% endwith %} 

Sản lượng:

0th Element 

này do thỏa thuận hợp đặc biệt thuận tiện nếu bạn cần truy cập vào chỉ số vòng lặp chính của khi giao dịch với một iterable bên trong một vòng lặp con:

{% for parent in parent_loop %} 
    {% cycle "0:1" "1:2" "2:3" as parent_loop_index silent %} 
    {% for child in child_loop %} 
     {{child|slice:parent_loop_index|join:""}} 
    {% endfor %} 
{% endfor %} 

Hoàn thành với không có gì nhưng phần chứng khoán, mặc dù tôi không nghĩ rằng Django đã thực hiện thành tích được nêu ra.

+0

Cảm ơn bạn! '| join:" "'! –

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