2011-07-01 26 views
6

Tôi có 3 bố cục trang sản phẩm khác nhau mà tôi muốn hiển thị phụ thuộc vào thông tin có sẵn về sản phẩm. Sử dụng traversal Tôi có một lớp gọi là ProductFinder lấy tất cả thông tin. Ví dụ: người dùng truy cập vào miền/green/small và ProductFinder sẽ liệt kê tất cả các sản phẩm từ DB của tôi có màu xanh lá cây và nhỏ. Danh sách này là self.products trong lớp ProductFinder. Trong __init__.py của tôi, tôi đã thêm dòng:Trong Kim tự tháp, làm cách nào tôi có thể sử dụng trình kết xuất đồ họa khác dựa trên nội dung của ngữ cảnh?

config.add_view('app.views.products', name='') 

trong products.py tôi có:

from pyramid.view import view_config 
@view_config(context='app.models.ProductFinder', renderer='productpage.mako') 
def products(context, request): 
    return dict(page=context) 

Dựa trên những gì trong context.products dù tôi muốn làm một mako khác nhau. Trong giá treo tường, tôi đã thực hiện một cái gì đó như:

def products(context, request): 
    if len(context.products) == 1: 
     return render("oneproduct.mako") 
    elif len(context.product) == 2: 
     return render("twoproducts.mako") 

Vậy làm cách nào tôi có thể hiển thị mẫu khác dựa trên nội dung của ngữ cảnh?

+0

Dòng đầu tiên của bạn ở đó "config.add_view ('app.views.products', name = '')" rất có thể là * không * những gì bạn muốn. @view_config là cái duy nhất tôi nghĩ bạn thực sự quan tâm ở đây. –

Trả lời

10

Tôi sẽ bắt đầu bằng cách nói kiểu sắp xếp này có vẻ giống như thứ bạn muốn quản lý trong mẫu của mình.

Tuy nhiên, bạn có thể ảnh hưởng đến trình kết xuất nào được sử dụng như một phần của tra cứu lượt xem theo bất kỳ cách nào bạn muốn. Như bạn đã biết, bạn có thể sử dụng cùng một trình xử lý khung nhìn cho nhiều khung nhìn, bạn chỉ cần giúp Pyramid tìm ra cái nào cần sử dụng.

Ví dụ:

from pyramid.view import view_config 

def ProductLengthPredicate(length): 
    def check_length(context, request): 
     return len(context.products) == length 
    return check_length 

@view_config(context='app.models.ProductFinder', renderer='oneproduct.mako', 
      custom_predicates=(ProductLengthPredicate(1),)) 
@view_config(context='app.models.ProductFinder', renderer='twoproducts.mako', 
      custom_predicates=(ProductLengthPredicate(2),)) 
@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako') 
def products(context, request): 
    return dict(page=context) 

NB. Một số người có thể quan tâm hơn đến cách tiếp cận render_to_response ở đây vì sau đó họ sẽ không dựa vào custom_predicates. Nhưng đó là tất nhiên tùy thuộc vào bạn!

@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako') 
def products(context, request) 
    opts = dict(page=context) 
    if len(context.products) == 1: 
     return render_to_response('oneproduct.mako', opts, request) 
    if len(context.products) == 2: 
     return render_to_response('twoproducts.mako', opts, request) 
    return opts 

này hoạt động vì Pyramid sẽ bỏ qua các kết xuất đồ họa nếu tầm nhìn của bạn trả về một Response() đó là chính xác những gì render_to_response làm.

+0

cảm ơn bạn rất nhiều. Các vị từ tùy chỉnh chính xác là những gì tôi đang tìm kiếm – jchysk

3

Tôi không chắc đó có phải là cách hay hay không, nhưng bạn có thể sử dụng request.override_renderer = 'oneproduct.mako'.

Nếu đó chỉ là một cách khác để hiển thị sản phẩm của bạn tùy thuộc vào số lượng, bạn nên thực hiện quyết định trong mẫu.

+0

Giải pháp đơn giản tuyệt vời! – Lee

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