2012-01-23 30 views
18

Có cái gì đó giống như xem một phần của net MVC 3 trong bình không?
Tôi muốn nhúng tiện ích vào một trang xem và tiện ích đó có logic riêng.Chế độ xem một phần của Flask như MVC 3

+0

Bạn có thể viết mã tiện ích trong một hàm và gọi hàm đó từ chế độ xem, điều đó là chưa đủ? –

+0

@Alex Morega làm thế nào để gọi functin trong jinja2 xem mẫu? – magicshui

+0

@magicshui Bạn chuyển nó vào render_template làm đối số ... – plaes

Trả lời

23

Có một số cách để đưa vào nội dung trong một mẫu Jinja2:

Tuyên bố include sẽ làm cho quan điểm cung cấp (với bối cảnh hiện nay theo mặc định):

{# In your_view_template.jinja #} 
{# ... your code ... #} 
{% include "widgets/your_widget.jinja" %} 
{# ... your code ... #} 

Bạn cũng có thể xác định macrosimport chúng vào xem mẫu:

{# In your_view_template.jinja #} 
{% import "widgets/your_widget.jinja" as your_widget %} 
{# ... your code ... #} 
{{ you_widget.render(your, important, variables, etc.) }} 
{# ... your code ... #} 

Cả import và 0.123.có thể sử dụng các biến, vì vậy một cái gì đó như thế này có thể:

# In your view 
if complex_conditions.are_true(): 
    widget = "widgets/special_custom_widget.jinja" 
else: 
    widget = "widgets/boring_widget.jinja" 
render_template("your_view.jinja", widget=widget) 

{# In your_view_template.jinja #} 
{% include widget %} 
{# 
import widget as sidebar_widget 
{{ sidebar_widget.render() }} 
would also work 
#} 

Những cả làm việc tương tự như quang cảnh một phần MVC của (ít nhất, bởi vì như tôi hiểu họ)

Cách khác, nếu widget của bạn cần truy cập vào ACL hoặc thông tin không nên có sẵn cho lớp mẫu và bạn không thể viết lại chế độ xem của mình để tận dụng lợi thế của includeimport bạn có thể thực hiện đề xuất của @ [Alex Morega] và chuyển trong một cuộc gọi dưới dạng biến cho mẫu và hiển thị nó đó.

# In your view 
render_template("your_view.jinja", widget=you_callable, etc, etc, etc) 

{# In your_view_template.jinja #} 
{# ... your code ... #} 
{{ widget() }} 
{# Or, if you are returning HTML that is not a Markup construct #} 
{{ widget() | safe }} 
{# ... your code ... #} 

Bạn có thể thậm chí tạo của riêng bạn template loader và tải mẫu khác nhau tùy thuộc vào hầu như bất cứ điều gì . Nhưng đó chắc chắn sẽ là quá mức cần thiết cho trường hợp này.

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