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

Slide 5

Slide 5 text

(Template) Tag

Slide 6

Slide 6 text

Variable

Slide 7

Slide 7 text

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

Function calling

Slide 17

Slide 17 text

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.