passing a variable into a jinja import or include from a parent html file

24,811

Solution 1

When you include a template into another one, it gains access to its context, so if you pass your person variable to mypage.html's context, you'll be able to access it from your imported template like this:

snippet.html:

<div id="item">
    <ul>
        <li>
            <span>{{ person.name }}</span>
            <span>{{ person.address }}</span>
        </li>
    </ul>
</div>

mypage.html:

<div id="result">
    {% include 'snippet.html' %}
</div>

view.py:

def view(person_id):
    person = Person.get(person_id) # or whatever source you get your data from
    return render_template('mypage.html', person=person)

Solution 2

This complements this answer by mdeous.

Environment globals are always available in macros, but context variables are not. To have the context available in an imported macro, you have to use with context when importing, e.g.:

{% from "your_macros.html" import your_macro with context %}
Share:
24,811
Jay
Author by

Jay

Updated on November 22, 2021

Comments

  • Jay
    Jay over 2 years

    The scenario would be:

    "you have a variable called person which contains a number of fields like name, address, etc which you want to pass to a partial piece of html" - this solution could be results from a search for customers for example

    snippet.html

    <div id="item">
      <ul>
         <li>
             <span>{{name}}</span>
             <span>{{address}}</span>
         <li>
      </ul>
    </div>
    

    mypage.html

    <div id="result">
       {% include "snippet.html" passing {{person}} %}
    </div>
    

    What is the best way to achieve this. In the documentation it talks about passing context around everywhere, but that seems to me to be a rather large object when rendering templates. surely it is easier to pass specific objects into each template?

  • aWebDeveloper
    aWebDeveloper over 10 years
    what about macros in included file
  • Dan
    Dan over 9 years
    The frustrating part of this is that you can't then make your small include generic enough to be agnostic to the "calling variable" name, so to speak. For instance, if I'm building a generic way to paginate some list of objects, I usually don't have them in an container called "objects", it's something more specific like "animals".
  • Achshar
    Achshar almost 7 years
    @Dan Why not use macros for that instead?