I need to pass variable in include html and tranlate that passed variable in Django.
In about.html file I include like that:
include "includes/breadcrumb.html" with dir_path="About us" %}
And in breadcrumb.html file I get variable
{{dir_path}} - it gives as expected: "About us"
But I tried like that to be able to translate it, but not working
{% blocktranslate with dir_path=dir_path %} {{dir_path }} {% endblocktranslate %}
Related
in one of my python projects, I'm looping through a list of countries which is stored in my SQLite database:
{% if europe %}
{% for country in europe %}
<figcaption>{{ country.Name_fr }}</figcaption>
{% endfor %}
{% endif %}
I am using localization so I have a locale folder with .po files with which I handle the different translations. However I would like to have the database strings (from {{ country.name_fr }}) show up in these .po files. This means I would have to include a translate tag but if I try it, it shows an error. This:
<figcaption>{% translate {{ country.Name_fr }} %}</figcaption>
leads to this:
TemplateSyntaxError at /
Could not parse the remainder: '{{' from '{{'
Any help would be appreciated
As translate template tag documentation states
It’s not possible to mix a template variable inside a string within {%
translate %}. If your translations require strings with variables
(placeholders), use {% blocktranslate %} instead.
So you could use blocktranslate
{% blocktranslate %}
{{ country.Name_fr}}
{% endblocktranslate %}
Even simpler for your use case would be to just pass variable to translate
The {% translate %} template tag translates either a constant string
(enclosed in single or double quotes) or variable content
{% translate country.Name_fr %}
I can't figure out how to get value of {% url "name" %} inside another {% %} tag. In my case its include
{% include "file" with next={% url "name" %} %}
This doesn't work. Do you know what to do? I would surround the {% include.. by {% with but it would cause the same problem.
Quick answer for django templates:
{% url "name" as my_url_context_var %}
{% include "file" with next=my_url_context_var %}
Lengthier explanation:
You cannot nest {% … %} or {{ … }}. The moment you open {{ … }}, you can only use context variables inside, optionally combined with template filters. Inside a {% … %}, you can only use whatever the tag you are using recognizes, but in general, that will be just a few arguments, some of which are static words (such as the as in the url above, or the with in the include), and often you can also access template variables and filters just like inside {{ … }}.
I'm not that familiar with jinja, but it seems that its include doesn't support the same kind of variable passing as django's include does, so here's an idea of what it might look like with jinja:
{% set next=url('name') %}
{% include "file" %}
I have common things in all Jinja files. I want to move all common content to one single Jinja file in Flask.
My app is written in Flask and I am passing context to Jinja template like
def f1(name): render_template('j1.jinja', name=name)
def f2(name): render_template('j2.jinja', name=name)
def f3(name): render_template('j3.jinja', name=name)
My j1.jinja file is:
{%block content %}
Name: {{ name }}
Hello
{% endblock %}
My j2.jinja file is:
{%block content %}
Name: {{ name }}
Bye
{% endblock %}
My j3.jinja file is:
{%block content %}
Name: {{ name }}
Howdy
{% endblock %}
I moved common content to single Jinja file common.jinja which is:
{% block content %}
Name : {{name}}
{% endblock %}
I am including it in all Jinja files like:
{% include 'common.jinja' with { "name": name } only %}
which doesn't work. I am getting the Exception:
Exception Occured. Explanation: expected token 'end of statement block', got 'with'
How can I pass context to included Jinja file?
Your code looks a bit weird. There is no separate with statement that specifies context, it is with context which is often used with import statement (see Import context behaviour).
To pass any context to an included template, simply render the parent template with context variables, e.g. in render_template():
render_template('j3.jinja', name=name)
Using Django templating engine I can include another partial template while setting a custom context using named arguments, like this:
{% include "list.html" with articles=articles_list1 only %}
{% include "list.html" with articles=articles_list2 only %}
As you may be supposing, articles_list1 and articles_list2 are two different lists, but I can reuse the very same list.html template which will be using the articles variable.
I'm trying to achieve the same thing using Jinja2, but I can't see what's the recommended way, as the with keyword is not supported.
Jinja2 has an extension that enables the with keyword - it won't give you the same syntax as Django, and it may not work the way you anticipate but you could do this:
{% with articles=articles_list1 %}
{% include "list.html" %}
{% endwith %}
{% with articles=articles_list2 %}
{% include "list.html" %}
{% endwith %}
However, if list.html is basically just functioning as a way to create a list then you might want to change it to a macro instead - this will give you much more flexibility.
{% macro build_list(articles) %}
<ul>
{% for art in articles %}
<li>{{art}}</li>
{% endfor %}
</ul>
{% endmacro %}
{# And you call it thusly #}
{{ build_list(articles_list1) }}
{{ build_list(articles_list2) }}
To use this macro from another template, import it:
{% from "build_list_macro_def.html" import build_list %}
This way you can pass multiple variables to Jinja2 Include statement - (by splitting variables by comma inside With statement):
{% with var_1=123, var_2="value 2", var_3=500 %}
{% include "your_template.html" %}
{% endwith %}
For readers in 2017+, Jinja as of 2.9 includes the with statement by default. No extension necessary.
http://jinja.pocoo.org/docs/2.9/templates/#with-statement
In older versions of Jinja (before 2.9) it was required to enable this feature with an extension. It’s now enabled by default.
Updated 2021+
Included templates have access to the variables of the active context by default. For more details about context behavior of imports and includes, see Import Context Behavior.
From Jinja 2.2 onwards, you can mark an include with ignore missing; in which case Jinja will ignore the statement if the template to be included does not exist. When combined with with or without context, it must be placed before the context visibility statement. Here are some valid examples:
{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}
Another option, without plugins, is to use macros and include them from another file:
file macro.j2
{% macro my_macro(param) %}
{{ param }}
{% endmacro %}
file main.j2
{% from 'macro.j2' import my_macro %}
{{ my_macro(param) }}
I cannot do the following in Django:
{% include "admin/includes/pager.html" with title_pager="{{myobject.title}}" %}
or
{% include "admin/includes/pager.html" with title_pager="{{myobject}}" %}
What is the workaround?
You do not need to surround arguments in {{ }} brackets in template tags.
If it's a variable, not a string, then do not use "" quotes.
The following should work:
{% include "admin/includes/pager.html" with title_pager=myobject.title %}
{% include "admin/includes/pager.html" with title_pager=myobject %}
See the Django docs for the include tag for more information.