user2276553
user2276553

Reputation:

How can I pass parameters to this Flask Jinja template function?

This works, but Id like to pass the parameter variable values to the section inside return render_template() so I can reuse test(), how can I do that?

""" Test.html """
@app.route('/test')
def test():
    """Renders the careers page."""
    return render_template(
        'content/loader.html',
        title='Test',
        year=datetime.now().year,
        message='Your Test page.',
        main_nav_active_ = '',
        layout_template = '/layouts/default.html',
        content_template = 'clarity.html'
    )

I would like to be able to use the function like this based on routes

""" Test.html """
def test(title,year,message, main_nav_active_, layout_template, content_template)
    """Renders the careers page."""
    return render_template(
        'content/loader.html',
        title=title,
        year=year,
        message=message,
        main_nav_active_ = main_nav_active_,
        layout_template = layout_template,
        content_template = content_template
    )

@app.route('/test2')
test(title='test2',year=datetime.now().year,message='Your Test page.', main_nav_active_='', layout_template='/layouts/default.html', content_template='clarity.html')

@app.route('/test3')
test(title='test3',year=datetime.now().year,message='Your Test page3.', main_nav_active_='', layout_template='/layouts/default.html', content_template='foo.html')

Upvotes: 0

Views: 2925

Answers (2)

zhangshine
zhangshine

Reputation: 26

def test(**kwargs)
    """Renders the careers page."""
    return render_template(
        'content/loader.html',
        **kwargs
    )

@app.route('/test2')
def test2():
    return test(title='test2',year=datetime.now().year,message='Your Test page.', main_nav_active_='', layout_template='/layouts/default.html', content_template='clarity.html')

@app.route('/test3')
def test3():
    return test(title='test3',year=datetime.now().year,message='Your Test page3.', main_nav_active_='', layout_template='/layouts/default.html', content_template='foo.html')

Upvotes: 0

Sean Vieira
Sean Vieira

Reputation: 160063

Simply extract test:

def test(
        template='content/loader.html',
        title='Test',
        year=None,
        message='Your Test page.',
        main_nav_active_='',
        layout_template='/layouts/default.html',
        content_template='clarity.html'
    ):
    """Renders a particular page type."""
    return render_template(
        template,
        title=title,
        year=year if year is not None else datetime.now().year,
        message=message,
        main_nav_active_=main_nav_active_,
        layout_template=layout_template,
        content_template=content_template
    )

Then you can register it with a URL using app.add_url_rule or use it as part of your other route(s) definitions:

app.add_url_rule("/test", "test", test)

# Or

@app.route("/another/<route>")
def alternatively(route_name):
    return test(title=route_name)

Upvotes: 1

Related Questions