2010-03-18 41 views
37

Tôi đang chuyển đến mẫu của Django một hàm, trả về một số bản ghi. Tôi muốn gọi hàm này và lặp lại kết quả của nó.Làm thế nào để gọi hàm có một đối số trong một mẫu Django?

{% for item in my_func(10) %} 

Điều đó không hiệu quả. Tôi đã cố gắng đặt giá trị trả về của hàm thành một biến và lặp qua biến, nhưng dường như không có cách nào để đặt biến trong mẫu Django.

Có cách nào bình thường để làm điều đó không?

Trả lời

47

Bạn không thể gọi hàm có yêu cầu đối số trong mẫu. Write thẻ mẫu hoặc bộ lọc thay thế.

+57

Rất buồn. Tôi muốn có một cách đơn giản hơn. – cleg

+1

Tôi nghĩ rằng giải pháp với python dựng sẵn '@ property' là giải pháp tốt hơn, tất nhiên, tùy thuộc vào tình huống. – jrast

+0

có, tuy nhiên điều đó không giải quyết được vấn đề. Django tự động gọi các hàm nếu chúng không yêu cầu đối số.Viết '{% cho mục trong myfunc%}' tương đương với 'cho mục trong myfunc()' nếu myfunc là một hàm không có đối số. Hạn chế thực sự duy nhất với django là gọi hàm mà yêu cầu đối số, mà '@ property' không giải quyết (mặc dù thừa nhận rằng bạn có thể đặt một số thuộc tính trong mẫu và sử dụng chúng làm đối số, nhưng điều đó không rõ ràng) – matts1

8

Tôi đang đi qua để mẫu Django của một chức năng, trong đó trả về cho tôi một số hồ sơ

Tại sao bạn không vượt qua Django template giá trị trả về chức năng lưu trữ của biến, thay vì chức năng?


Tôi đã cố gắng để thiết lập giá trị trả về fuction của một biến và duyệt qua biến, nhưng có vẻ là không có cách nào để thiết lập biến trong Django mẫu.

Bạn nên đặt biến trong chế độ xem Django thay vì mẫu và sau đó chuyển chúng vào mẫu.

+0

Hàm này trả về một số bản ghi và tham số là số đếm của chúng. Tôi muốn kiểm soát giá trị này từ mẫu. – cleg

+2

Điều gì sẽ xảy ra nếu bạn muốn hàm được đánh giá một cách lười biếng? ví dụ. bạn muốn kết quả có sẵn nếu cần thiết, nhưng bạn không muốn tính toán nó cho không có gì? Tôi đoán tôi đang bị mắc kẹt khi viết các thẻ mẫu .. – Rob

2

Theo thiết kế, các mẫu Django không thể gọi vào mã Python tùy ý. Đây là một tính năng bảo mật và an toàn cho môi trường nơi các nhà thiết kế viết các mẫu, và nó cũng ngăn cản logic nghiệp vụ di chuyển vào các khuôn mẫu.

Nếu bạn muốn thực hiện việc này, bạn có thể chuyển sang sử dụng các mẫu Jinja2 (http://jinja.pocoo.org/docs/) hoặc bất kỳ hệ thống templating nào khác mà bạn thích hỗ trợ tính năng này. Không có phần nào khác của django sẽ bị ảnh hưởng bởi các mẫu bạn sử dụng, bởi vì nó là cố ý một quá trình một chiều. Bạn thậm chí có thể sử dụng nhiều hệ thống mẫu khác nhau trong cùng một dự án nếu bạn muốn.

15

nếu bạn có một đối tượng, bạn có thể xác định nó là @property để bạn có thể nhận được kết quả mà không có cuộc gọi, ví dụ:

class Item: 
    @property 
    def results(self): 
     return something 

sau đó trong mẫu:

<% for result in item.results %> 
... 
<% endfor %> 
+0

Bạn có tài liệu tham khảo về @sherpya này không? – bozdoz

+2

python được xây dựng trong tài sản http://docs.python.org/2/library/functions.html#property – sherpya

+0

Không giống nhau. Những thứ trong mảng có thể là các hạng mục khác nhau. – kentor

1

gì bạn có thể làm được, tạo ra các "chức năng" như một mẫu tập tin và sau đó bao gồm tập tin đó đi qua các thông số với nó.

Bên index.html

<h3> Latest Songs </h3> 
{% include "song_player_list.html" with songs=latest_songs %} 

Bên song_player_list.html

<ul> 
{% for song in songs %} 
<li> 
<div id='songtile'> 
<a href='/songs/download/{{song.id}}/'><i class='fa fa-cloud-download'></i>&nbsp;Download</a> 

</div> 
</li> 
{% endfor %} 
</ul> 
+0

Làm thế nào tôi có thể kiểm soát '{% include" song_player_list.html "với bài hát = latest_songs%}' chỉ thực thi khi một nút được bấm. Tôi đã cố gắng để đặt nó trong một chức năng nhưng 'Django mẫu' thực hiện nó mọi lúc tôi tải trang. –

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