Template tags

Template tags are the way for Django templates to use Python code. Django has a large list of built-in template tags for everything from looping over objects, date formatting, boolean logic with if/else blocks, or getting the length of an object. By default, all template tags in Django are available in markdown content files.

Humanize template tags

django.contrib.humanize includes a useful template tags to format numbers and dates in human-friendly ways. Normally it needs to be enabled and loaded in templates manually, but coltrane enables it by default so it is available to use in markdown content files automatically.

Coltrane template tags

directory_contents

A list of the content at a particular directory.

List markdown files based on the request path

If the request url is https://localhost:8000/ and there are these files:

  • content/test1.md

  • content/test2.md

# Contents

{% directory_contents as directory_contents %}

{% for content in directory_contents %}

- {{ content.slug }}

{% endfor %}
<h1 id="contents">Contents</h1>

<ul>
  <li>test1</li>
  <li>test2</li>
</ul>

List markdown files based on a particular directory

If the request url is https://localhost:8000/ and there are these files:

  • content/articles/article1.md

  • content/articles/article2.md

# Articles

{% directory_contents 'articles' as directory_contents %}

{% for content in directory_contents %}

- {{ content.slug }}

{% endfor %}
<h1 id='articles'>Articles</h1>

<ul>
  <li>article1</li>
  <li>article2</li>
</ul>

Exclude a slug from being included

If the request url is https://localhost:8000/ and there are these files:

  • content/articles/article1.md

  • content/articles/article2.md

# Articles

{% directory_contents 'articles' exclude='article1' as directory_contents %}

{% for content in directory_contents %}

- {{ content.slug }}

{% endfor %}
<h1 id="articles">Articles</h1>

<ul>
  <li>article2</li>
</ul>

Sort the results of the directory

The order_by kwarg will sort the results by a particular key. Available keys are slug, now, and anything in the YAML frontmatter. All keys will be coerced to strings and if a key is missing an empty string will be used by default.

If the request url is https://localhost:8000/ and these files are present in the content directory:

  • content/article1.md

  • content/article2.md

# Sorted Articles

{% directory_contents order_by='slug' as directory_contents %}

{% for content in directory_contents %}

- {{ content.slug }}

{% endfor %}
<h1 id="sorted-articles">Sorted Articles</h1>

<ul>
  <li>article1</li>
  <li>article2</li>
</ul>
# Reverse Sorted Articles

{% directory_contents order_by='-slug' as directory_contents %}

{% for content in directory_contents %}

- {{ content.slug }}

{% endfor %}
<h1 id="reverse-sorted-articles">Reverse Sorted Articles</h1>

<ul>
  <li>article2</li>
  <li>article1</li>
</ul>

include_md

Similar to the include template tag, but can be used to include a markdown file and have it render correctly into HTML. It can be used in markdown files or in HTML templates.

# include_md

{% include_md '_partial.md' %}
<h1>include_md</h1>

{% include_md '_partial.md' %}

parent

A filter that returns the parent directory for a particular path. Can be passed a request or a string.

<!-- request of http://localhost/articles/some-article -->
{{ request|parent }} == '/articles'
{{ 'http://localhost/articles/some-article'|parent|parent }} == ''

to_html

Convert raw markdown text to html. This is probably the most useful when using coltrane as a Django app.

views.py

def my_view(request):
    markdown_text = """---
title: Article 1
---

# {{ title }}
"""
    ...

my_template.html

<main>
    {{ markdown_text|to_html }}
</main>

Rendered html content

<main>
   <h1>Article 1</h1>
</main>

raise_404

Raises a 404 from template. Can be useful when using wildcard HTML templates.

last_path

Gets the last portion the URL path, e.g. the last path of /app/user/123 would be "123".

paths

Gets all parts of the path as a list of strings, e.g. the paths of /app/user/123 would be ["app", "user", "123"].

Custom template tags

coltrane will automatically enable any template tags it finds in the templatetags directory to be used in markdown or HTML templates.

templatetags/custom_tags.py

from django import template

register = template.Library()

@register.filter(name="test")
def test(value, arg):
    return value + " is a test"

content/index.md

{{ 'This'|test }}

Generated index.html

This is a test

Note

For integrated mode, custom template tags can be loaded like normal in the markdown file.

content/index.md

{% load custom_tags %}

{{ "This"|some_custom_filter }}