Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to pass variables into Jinja2 parents?

I'm trying to pass some variables from the child page to the template. This is my python code:

    if self.request.url.find("&try") == 1:
        isTrying = False
    else:
        isTrying = True

    page_values = {
        "trying": isTrying
    }

    page = jinja_environment.get_template("p/index.html")
    self.response.out.write(page.render(page_values))

The template:

<html>
  <head>
    <link type="text/css" rel="stylesheet" href="/css/template.css"></link>
    <title>{{ title }} | SST QA</title>

    <script src="/js/jquery.min.js"></script>

  {% block head %}{% endblock head %}
  </head>
  <body>
    {% if not trying %}
    <script type="text/javascript">
    // Redirects user to maintainence page
    window.location.href = "construct"
    </script>
    {% endif %}

    {% block content %}{% endblock content %}
  </body>
</html>

and the child:

{% extends "/templates/template.html" %}
{% set title = "Welcome" %}
{% block head %}
{% endblock head %}
{% block content %}
{% endblock content %}

The problem is, I want to pass the variable "trying" into the parent, is there a way to do this?

Thanks in advance!

like image 618
ihsoy ih Avatar asked Jan 10 '13 09:01

ihsoy ih


3 Answers

The example on the Jinja2 Tips and Tricks page explains this perfectly, http://jinja.pocoo.org/docs/templates/#base-template. Essentially, if you have a base template

**base.html**
<html>
    <head>
        <title> MegaCorp -{% block title %}{% endblock %}</title>
    </head>
    <body>
        <div id="content">{% block content %}{% endblock %}</div>
    </body>
</html>

and a child template

**child.html**
{% extends "base.html" %}
{% block title %} Home page {% endblock %}
{% block content %}
... stuff here
{% endblock %}

whatever python function calls render_template("child.html") will return the html page

**Rendered Page**
<html>
    <head>
        <title> MegaCorp - Home page </title>
    </head>
    <body>
        <div id="content">
            stuff here...
        </div>
    </body>
</html>
like image 169
user1876508 Avatar answered Nov 03 '22 06:11

user1876508


I think that you are looking to highlight active menus in the base layout and you need something like this

{% extends 'base.html' %}
{% set active = "clients" %}

then use can use "active" inside base.html

like image 7
Dimitar Marinov Avatar answered Nov 03 '22 06:11

Dimitar Marinov


You just need to declare that variable before extending the template, so the extended template will have access to to the variable trying

{% set trying = True %}  <----------- declare variable

{% extends "/templates/template.html" %}
{% set title = "Welcome" %}
{% block head %}
{% endblock head %}
{% block content %}
{% endblock content %}

Few years later but hoping it may help latecomers

like image 4
sscalvo Avatar answered Nov 03 '22 07:11

sscalvo