Lingfeng Xiong
Lingfeng Xiong

Reputation: 1171

Pyramid - Dynamically assign template to view

In Pyramid, templates are statically assigned to view with

@view_config(renderer='templates/foo.pt')
def my_view(request):
    return {'foo':1, 'bar':2}

However, in some cases, we want to set different template for each user. For example, user1 use templates from templates/style1/xxx.pt and user2 use templates from templates/style2/xxx.pt. Thus, we need a way to dynamically pass templates to views, instead of configure them statically.

Is there anyway to do the task elegantly?

Upvotes: 3

Views: 381

Answers (2)

fat fantasma
fat fantasma

Reputation: 7613

How about something like this. I have not tested it. I'm pulling from memory :)

Add this to your init.py in your config settings.

 config.add_route('my_view', 'my_view/{renderer}')

Use this view:

 @view_config(route_name='my_view', renderer='')
 def my_view(request):
    renderer = request.matchdict['renderer']
    data = get_my_data_for_renderer()
    return render_to_response(renderer, data, request)

Upvotes: 1

fat fantasma
fat fantasma

Reputation: 7613

I just did this a couple of days ago.

Here is example code for an ajax call.

@view_config(name="my_view", renderer="")
def my_view(request):

    renderer = choose_renderer()            #this is where you would dynamically choose what renderer you want. ex "templates/foo.pt"
    data = get_my_data_for_renderer

    return render_to_response(renderer, data, request)

Here is an example for a normal route call

    @view_config(route_name="my_view", renderer="")
def my_view(request):

    renderer = choose_renderer()            #this is where you would dynamically choose what renderer you want. ex "templates/foo.pt"
    data = get_my_data_for_renderer

    return render_to_response(renderer, data, request)

Upvotes: 3

Related Questions