Quirks in Django's template language part 3

Django Rusty Templates Since September 2024, I (and some collaborators) have been building a reimplementation of Django’s templating language in Rust, called Django Rusty Templates. During this process, we have discovered several weird edge-cases and bugs, some of which I’ve talked about before (Part 1, Part 2). The {% now %} tag The {% now %} tag is provided by Django to display the current date or time. It uses a format specifier language designed for compatibility with PHP, which feels like an odd decision in retrospect, since most Python programmers are used to the strftime style formatting provided by the Python datetime module. ...

January 25, 2026

Sharing a mutable reference with Python

Background As part of my ongoing project to reimplement Django’s templating language in Rust, I have been adding support for custom template tags. Simple tags The simplest custom tag will look something like: # time_tags.py from datetime import datetime from django import template register = template.Library() @register.simple_tag def time(format_string): now = datetime.now() return now.strftime(format_string) # time_tags.py from datetime import datetime from django import template register = template.Library() @register.simple_tag def current_time(format_string): return datetime.now().strftime(format_string) ...

September 2, 2025

Quirks in Django's template language part 2

Django Rusty Templates Since September 2024, I have been building a reimplementation of Django’s templating language in Rust, called Django Rusty Templates. During this process, I have discovered several weird edge-cases and bugs, some of which I’ve talked about before. Centring strings Django supports a template filter for centring strings: {{ "Django"|center:10 }} which adds padding around the string to reach the provided length. In this simple case, the template is rendered as ··Django·· (where · represents a space character). ...

July 20, 2025

Quirks in Django's template language

Django Rusty Templates Since September 2024, I have been building a reimplementation of Django’s templating language in Rust, called Django Rusty Templates. During this process, I have discovered several weird edge-cases and bugs. Scientific notation Django supports writing floats in scientific notation (e.g. 6.28e23) in templates. However using a negative exponent was not supported: "{{ foo|default:5.2e-3 }}" Traceback (most recent call last): TemplateSyntaxError: Could not parse the remainder: '-3' from 'foo|default:5.2e-3' >>> from django.template.base import Template >>> Template("{{ foo|default:5.2e-3 }}") Traceback (most recent call last): ... raise TemplateSyntaxError( django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: '-3' from 'foo|default:5.2e-3' ...

April 26, 2025