Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Django + Jinja2
Slide 2
Slide 2 text
Django Templates • The Django Template Language • How Django loads templates
Slide 3
Slide 3 text
Django Templates • The Django Template Language • How Django loads templates DTL
Slide 4
Slide 4 text
{% for user in users.all %}
{{ user.username|capitalize }}
{% endfor %}
Slide 5
Slide 5 text
{% for user in users.all %}
{{ user.username|capitalize }}
{% endfor %}
(Template) Tag
Slide 6
Slide 6 text
{% for user in users.all %}
{{ user.username|capitalize }}
{% endfor %}
Variable
Slide 7
Slide 7 text
{% for user in users.all %}
{{ user.username|capitalize }}
{% endfor %}
Variable + Filter
Slide 8
Slide 8 text
The DTL • Simple syntax with few rules • Lightweight extensions • Self-contained
Slide 9
Slide 9 text
But… • Awkward DSL • No scoped functions • Slow with frequent rendering
Slide 10
Slide 10 text
Django 1.8 • django.template • django.template.backends
Slide 11
Slide 11 text
TEMPLATE_CONTEXT_PROCESSORS TEMPLATE_DEBUG TEMPLATE_STRING_IF_INVALID TEMPLATE_DIRS TEMPLATE_LOADERS The Language The System
Slide 12
Slide 12 text
TEMPLATE_CONTEXT_PROCESSORS TEMPLATE_DEBUG TEMPLATE_STRING_IF_INVALID TEMPLATE_DIRS TEMPLATE_LOADERS The Language The System
Slide 13
Slide 13 text
TEMPLATES = [ { 'BACKEND': '...', 'DIRS': [], 'OPTIONS': { 'context_processors': [...], 'debug': False, 'string_if_invalid': '', }, }, ] Language-specific Setup Template-loading Setup
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
Jinja2 • Armin Ronacher (aka mitsuhiko) • Inspired by the DTL • Standalone library • More programmer-friendly
Slide 16
Slide 16 text
{% for user in users.all() %}
{{ user.username.toupper() }}
{% endfor %}
Function calling
Slide 17
Slide 17 text
{% for user in users.get_friends(me) %}
{{ user.username.toupper() }}
{% endfor %}
Slide 18
Slide 18 text
Settings for Jinja2 { 'BACKEND': ( 'django.template.backends.' 'jinja2.Jinja2'), 'DIRS': [], 'APP_DIRS': True, },
Slide 19
Slide 19 text
demoapp ├── jinja2 │ └── a_jinja2_template.html ├── models.py ├── templates │ └── a_django_template.html ├── urls.py └── views.py
Slide 20
Slide 20 text
demoapp ├── jinja2 │ └── a_jinja2_template.html ├── models.py ├── templates │ └── a_django_template.html ├── urls.py └── views.py Configurable (not recommended)
Slide 21
Slide 21 text
Jinja2 for Django • Auto-escape on • Custom template loader • Debug enhancements • Auto-reload • Undefined raises exceptions
Slide 22
Slide 22 text
But • Jinja2 is not built (just) for Web • Web-related functionalities • Django internals
Slide 23
Slide 23 text
{% url 'pages:page' name=page_name %} {% static 'base/css/site.min.css' %} {% trans 'This is my website!' %} {% csrf_token %}
Slide 24
Slide 24 text
https://github.com/MoritzS/jinja2-django-tags
Slide 25
Slide 25 text
{ 'BACKEND': ('django.template.backends.' 'jinja2.Jinja2'), 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'extensions': [ 'jdj_tags.extensions.DjangoStatic', 'jdj_tags.extensions.DjangoI18n', ] }, },
Slide 26
Slide 26 text
Jinja2 vs DTL • Functions vs template tags • Methods vs filters • Extensions are loaded by project
Slide 27
Slide 27 text
The Flask Way • {% url_for(endpoint, **kwargs) %} • Endpoint 'static' • {% get_flashed_messages(...) %} • I18n API (already pretty similar) • {{ csrf_token() }}
Slide 28
Slide 28 text
To boldly go where no one has gone before.