Skip to main content

A Django template formatter.

Project description

https://img.shields.io/github/actions/workflow/status/adamchainz/djade/main.yml.svg?branch=main&style=for-the-badge https://img.shields.io/pypi/v/djade.svg?style=for-the-badge pre-commit
You can have any colour you like, as long as it’s jade.

A Django template formatter.

You can have any colour you like, as long as it’s [d]jade.

Djade formats Django template syntax with a style based on the template style guide in Django’s documentation. It does not format HTML or other templated languages.

Djade is fast because it is built in Rust: benchmarked taking 20ms to format 377 templates.

Read more in the introductory post, or below.


Improve your Django and Git skills with my books.


Installation

Use pip:

python -m pip install djade

Python 3.9 to 3.13 supported.

pre-commit hook

You can also install Djade as a pre-commit hook.

First, add the following to the repos section of your .pre-commit-config.yaml file (docs):

-   repo: https://github.com/adamchainz/djade-pre-commit
    rev: ""  # Replace with the latest tag on GitHub
    hooks:
    -   id: djade
        args: [--target-version, "5.2"]  # Replace with Django version

The separate repository enables installation without compiling the Rust code.

The default configuration uses pre-commit’s files option to pick up all text files in directories called templates (source). You may wish to override this if you have templates in different directories by adding files to the hook configuration in your .pre-commit-config.yaml file.

Second, format your entire project:

pre-commit run djade --all-files

Check these changes for any potential Djade bugs and commit them. Try git diff --ignore-all-space to check non-whitespace changes.

Third, consider adding the previous commit SHA to a .git-blame-ignore-revs file. This will prevent the initial formatting commit from showing up in git blame.

Keep the hook installed to continue formatting your templates. pre-commit’s autoupdate command will upgrade Djade so you can take advantage of future features.

Usage

djade is a command line tool that rewrites files in place. Pass a list of template files to format them:

$ djade --target-version 5.2 templates/engine.html
1 file reformatted

Djade can also upgrade some old template syntax. Add the --target-version option with your Django version as <major>.<minor> to enable applicable fixers:

$ djade --target-version 5.2 templates/engine.html
1 file reformatted

Djade does not have any ability to recurse through directories. Use the pre-commit integration, globbing, or another technique to apply it to many files. For example, with git ls-files | xargs:

git ls-files -z -- '*.html' | xargs -0r djade

…or PowerShell’s ForEach-Object:

git ls-files -- '*.html' | %{djade $_}

Options

--target-version

Optional: the version of Django to target, in the format <major>.<minor>. If provided, Djade enables its fixers for versions up to and including the target version. See the list of available versions with djade --help.

--check

Avoid writing any formatted files back. Instead, exit with a non-zero status code if any files would have been modified, and zero otherwise.

Formatting

Djade aims to format Django template syntax in a consistent, clean way. It wants to be like Black: opinionated and free of configuration. Djade’s style is based on the rules listed in the Django contribution style guide’s template style section, plus some more.

Djade does not aim to format the host language of templates (HTML, etc.). That is a much broader scope and hard to do without semantic changes. For example, whitespace is significant in some HTML contexts, such as in <pre> tags, so even adjusting indentation can affect the meaning.

Below are the rules that Djade implements.

Rules from the Django style guide:

  • Single spaces at the start and end of variables and tags:

    -{{train}}
    +{{ train }}
    
    -{%  blow whistle  %}
    +{% blow whistle %}
  • Label {% endblock %} tags that aren’t on the same line as their opening {% block %} tag:

     {% block funnel %}
     ...
    -{% endblock %}
    +{% endblock funnel %}
  • Sort libraries in {% load %} tags:

    -{% load coal boiler %}
    +{% load boiler coal %}
  • Inside variables, no spaces around filters:

    -{{ fire | stoke }}
    +{{ fire|stoke }}
  • Inside tags, single spaces between tokens:

    -{% if  locomotive  ==  'steam engine'  %}
    +{% if locomotive == 'steam engine' %}
  • Unindent top-level {% block %} and {% endblock %} tags when {% extends %} is used:

    -  {% extends 'engine.html' %}
    +{% extends 'engine.html' %}
    
    -  {% block boiler %}
    +{% block boiler %}
       ...
    -  {% endblock boiler %}
    +{% endblock boiler %}

Extra rules:

  • No leading empty lines:

    -
     {% extends 'engine.html' %}
     ...
  • No trailing empty lines:

     ...
     {% endblock wheels %}
    -
    -
  • Single spaces at the start and end of comments:

    -{#choo choo#}
    +{# choo choo #}
  • No labels in {% endblock %} tags on the same line as their opening {% block %} tag:

    -{% block funnel %}...{% endblock funnel %}
    +{% block funnel %}...{% endblock %}
  • Merge consecutive {% load %} tags:

    -{% load boiler %}
    -
    -{% load coal %}
    +{% load boiler coal %}
  • Sort loaded items in {% load ... from .. %} tags:

-{% load steam heat from boiler %}
+{% load heat steam from boiler %}
  • Unindent {% extends %} tags:

    -  {% extends 'engine.html' %}
    +{% extends 'engine.html' %}
  • Exactly one blank line between top-level {% block %} and {% endblock %} tags when {% extends %} is used:

 {% extends 'engine.html' %}

-
 {% block funnel %}
   ...
 {% endblock funnel %}
+
 {% block boiler %}
   ...
 {% endblock boiler %}

Fixers

Djade applies the below fixes based on the target Django version from --target-version.

Django 4.2+: length_is -> length

From the release note:

The length_is template filter is deprecated in favor of length and the == operator within an {% if %} tag.

Djade updates usage of the deprecated filter within if tags, without other conditions, appropriately:

-{% if engines|length_is:1 %}
+{% if engines|length == 1 %}

Django 4.1+: empty ID json_script fixer

From the release note:

The HTML <script> element id attribute is no longer required when wrapping the json_script template filter.

Djade removes the argument where json_script is passed an empty string, to avoid emitting id="":

-{% tracks|json_script:"" %}
+{% tracks|json_script %}

Django 3.1+: trans -> translate, blocktrans / endblocktrans -> blocktranslate / endblocktranslate

From the release note:

The renamed translate and blocktranslate template tags are introduced for internationalization in template code. The older trans and blocktrans template tags aliases continue to work, and will be retained for the foreseeable future.

Djade updates the deprecated tags appropriately:

-{% load blocktrans trans from i18n %}
+{% load blocktranslate translate from i18n %}

-{% trans "Engine colours" %}
+{% translate "Engine colours" %}

-{% blocktrans with colour=engine.colour %}
+{% blocktranslate with colour=engine.colour %}
 This engine is {{ colour }}.
-{% endblocktrans %}
+{% endblocktranslate %}

Django 3.1+: ifequal and ifnotequal -> if

From the release note:

The {% ifequal %} and {% ifnotequal %} template tags are deprecated in favor of {% if %}.

Djade updates the deprecated tags appropriately:

-{% ifequal engine.colour 'blue' %}
+{% if engine.colour == 'blue' %}
 Thomas!
-{% endifequal %}
+{% endif %}

-{% ifnotequal engine.colour 'blue' %}
+{% if engine.colour != 'blue' %}
 Not Thomas.
-{% endifnotequal %}
+{% endif %}

Django 2.1+: admin_static and staticfiles -> static

From the release note:

{% load staticfiles %} and {% load admin_static %} are deprecated in favor of {% load static %}, which works the same.

Djade updates {% load %} tags appropriately:

-{% load staticfiles %}
+{% load static %}

-{% load admin_static %}
+{% load static %}

Django 1.3+: legacy variable assignment syntax

The minimum target Django version is 2.1, so this fixer is always active.

Django 1.3 added support for = to assign variables in {% with %} and {% blocktranslate %} tags. Prior to this, they only supported the legacy syntax using the as keyword, which Django still supports.

Djade rewrites the older as syntax to the newer = one:

-{% with engines.count as total %}
+{% with total=engines.count %}
     ...
 {% endwith %}

-{% blocktranslate with engine.colour as colour %}
+{% blocktranslate with colour=engine.colour %}
     ...
 {% endblocktranslate %}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

djade-1.4.0.tar.gz (35.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

djade-1.4.0-py3-none-win_arm64.whl (834.7 kB view details)

Uploaded Python 3Windows ARM64

djade-1.4.0-py3-none-win_amd64.whl (908.5 kB view details)

Uploaded Python 3Windows x86-64

djade-1.4.0-py3-none-win32.whl (824.8 kB view details)

Uploaded Python 3Windows x86

djade-1.4.0-py3-none-musllinux_1_1_x86_64.whl (1.2 MB view details)

Uploaded Python 3musllinux: musl 1.1+ x86-64

djade-1.4.0-py3-none-musllinux_1_1_aarch64.whl (1.2 MB view details)

Uploaded Python 3musllinux: musl 1.1+ ARM64

djade-1.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

djade-1.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

djade-1.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

djade-1.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

djade-1.4.0-py3-none-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

djade-1.4.0-py3-none-macosx_10_12_x86_64.whl (1.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file djade-1.4.0.tar.gz.

File metadata

  • Download URL: djade-1.4.0.tar.gz
  • Upload date:
  • Size: 35.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for djade-1.4.0.tar.gz
Algorithm Hash digest
SHA256 e8e88032a1297c7687ea763b0ad1e2f2aa7b9bcdecc6ac25bc717bb611f87c42
MD5 c00cc8eb74094018a1f7a07cf827927b
BLAKE2b-256 f55fad5d1926aedee604bde2e17b4008db809755528ba426f361fbf725966b81

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0.tar.gz:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: djade-1.4.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 834.7 kB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for djade-1.4.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 039a3de56f81d8b76722d86768cc1ab87e57c115dc3f131461a2e6d03d820cd1
MD5 82af62f78144705397cb371e65d52cdc
BLAKE2b-256 63a22034615cee7cb1d8b1779c15b0cb1f6bd757237b9542c90f9a7840dee1e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-win_arm64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: djade-1.4.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 908.5 kB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for djade-1.4.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 17d163342f7a892083a70aeb950b5f4a9ae09b443e3c24302a7159937581ea6f
MD5 86044bd5144e715780c35bfde0e35c56
BLAKE2b-256 588fb5a292f29dc897202ad53eae00da3a77482e3733c7be3c3628a66610496c

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-win_amd64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-win32.whl.

File metadata

  • Download URL: djade-1.4.0-py3-none-win32.whl
  • Upload date:
  • Size: 824.8 kB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for djade-1.4.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 62160a16325c6dfb4b52191e9283790745c213127f7abeeb47619a3b0c7cbd77
MD5 c9daad26c3857829a9bf551dcf1ad03c
BLAKE2b-256 9a66a2965059bef98e76938fe0819e70334629dce7faf6c1dd1819b70d03a142

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-win32.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 9179b61af120c7a138074e1546d876c262c8f33f710bc408811e0eae21066e52
MD5 21a3550a9d44f02614cdff1f0b4b08fb
BLAKE2b-256 c6d866193e347ec73d90aebc3d39d2ac7312515d0b84963fab2dddad9c2e768d

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-musllinux_1_1_x86_64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 94aa91460348ab3e25edd81ac7555843885f8dcf68741d075c8a66af4b70c0f6
MD5 5542285a9ccdda440bae9ea7c98ea689
BLAKE2b-256 3882c802f02636d888faa29cb0618be2412148fee44f40248ab5e3d3cffca318

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-musllinux_1_1_aarch64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a89f692b8ee46532db4f68a6e56de032581fcfb66961f83fe6282d89570ad4f7
MD5 f8a14a88efffbde2e0626652421fec90
BLAKE2b-256 00b0a518f80a9d306f1aec3ed74fc321fbf33009a5050765e0453f24a4f9617c

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e878ab0270ff1fdb2fcaea2bc364f71e5ac4a2893242761a0a244ccdfb3b27b8
MD5 28d33e26aa5d74e885d93942514ecc0d
BLAKE2b-256 a785cc66069dae4d5372c7327fbef68b0d80b65c0cb1955edda12ac61f6a16b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 13e5e2809d0d0e86518f958c71ecac14e29abff2d963e3137522d84104c19579
MD5 ea97845c143dad4cdf10055bfe34188b
BLAKE2b-256 6ca51f637b4494eeba7c8bb77fc9bb0cb8849c530c533efd10171676c2731cd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b732cf9b955f48b1aa484f5a8bdb0dc756cc6f5ac2159662e093e4b297cca8fe
MD5 68b22e39d53f5e8616294a96a2823402
BLAKE2b-256 8d42798b54c52e94661654b094e1f9e9ad616c2fa23040db985feea3d5a0a909

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: djade-1.4.0-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for djade-1.4.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0e71c3f2a0c0aed9a67261f44e4bfd7a606c36d3d53ad042aa3cd2b9152bec39
MD5 7c100a0251d55fd8f064087dfefdaab7
BLAKE2b-256 219834d75dbce65271723a48df2636cb96722eccc22eec6705c54de7c623edbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-macosx_11_0_arm64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file djade-1.4.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for djade-1.4.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0e5b962993e229459167a6615cdc7f3d7801832647d45817e3339b128576bf2c
MD5 52e6b1a860b7aec978e4f38bece82ab0
BLAKE2b-256 e1de91bb09337112aabf1944cc86f08e3e9db5ef20c8a924a74b1c3784c2aa40

See more details on using hashes here.

Provenance

The following attestation bundles were made for djade-1.4.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: main.yml on adamchainz/djade

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page