Page contexts
When rendering a page, it’s sometimes useful to have a context - variables and values which can be used to control templates.
For example, lets assume we have a blog.html Django template which looks like:
{% extends "base.html" %}
{% block header %}
<h1>{{ title }}</h1>
<p>By {{ author }}</p>
{% endblock %}
{% block content %}
This block will be replaced by the markdown content
{% endblock %}
{% block article %}
or we could put the content in a different block like this:<hr>
{{ content }}
{% endblock %}
This page template uses several template variables - title, author and
content.
We can define this context in the page file between two --- lines, which must appear
at the very top of the document:
---
extends: blog.html
title: Hello world
author: Richard
---
Page contents
This will look familiar to you if you have used other static site generators - django-nanopages uses a similar approach to front matter in Jekyll, Hugo or 11ty.
Configure nanopages
The variables defined are then available in the context for the base template. There are some special keys:
extends- the name of the base template - file content will be put in the{% block content %}if it exists. Defaults to"base.html".content- django-nanopages will set this to the markdown file content, so do not set this yourself.
Context languages
The default context format is a simple key: value pairs, where all values are
strings without newlines - it is not YAML.
If pyyaml is installed, you can specify the YAML context parser:
---yaml
extends: blog.html
title: "Hello world"
lede: |
In this article we explore the warmth and positivity
that a simple greeting can bring.
authors:
- Richard
- Murgatroyd
- Persephone
---
Page contents
For this to work, you will need to install pyyaml first:
pip install pyyaml
# or
pip install django-nanopages[full]
You can also use JSON, where the top level are key/value pairs for an object:
---json
"extends": "blog.html",
"title": "Hello world",
"authors": ["Richard", "Murgatroyd", "Persephone"]
---
Page contents
HTML files
HTML files are treated as Django templates, so you should manually extend a template. You can then override blocks and use template tags as you would any template.