Skip to main content

dj-toml-settings ⚙️

Load Django settings from a TOML file

dj-toml-settings reads settings from a TOML file. By default, both pyproject.toml and django.toml files are parsed for settings in the [tool.django] namespace.

[tool.django]

# Paths are relative to the TOML file (unless they are absolute)
BASE_DIR = { "$path" = "." }
STATIC_ROOT = { "$path" = "staticfiles" }

# This sets the key based on the environment variable
SECRET_KEY = { "$env" = "SECRET_KEY" }

# This sets the key based on the environment variable, but has a fallback
ADMIN_URL_PATH = { "$env" = "ADMIN_URL_PATH", "$default"="admin" }

# Booleans, arrays, tables (dictionaries), integers, strings, floats, dates are all supported in TOML
DEBUG = true
ALLOWED_HOSTS = [
  "127.0.0.1",
]

# Values can be cast to a bool, int, str, float, decimal, datetime, date, time, timedelta, url, Path
SITE_ID = { "$int" = "1" }
SITE_ID = { "$value" = "1", "$type" = "int" }  # This is equivalent to the previous line

# Database and cache URLs can be parsed and converted to typical Django dictionary settings
DATABASES = { default = { "$db" = "postgres://user:pass@localhost:5432/dbname" } }
CACHES = { default = { "$cache" = "redis://127.0.0.1:6379/1" } }

# This is an implicit dictionary and equivalent to `COLTRANE = { TITLE = "Example blog" }`
[tool.django.COLTRANE]
TITLE = "Example blog"

# Any name can be used under the `apps` namespace to organize settings
[tool.django.apps.tailwind-cli]
TAILWIND_CLI_USE_DAISY_UI = true
TAILWIND_CLI_SRC_CSS = ".django_tailwind_cli/source.css"

# The `envs` namespace can be used for environment-specific settings, e.g. these settings are included when the `ENVIRONMENT` environment variable is "development"
[tool.django.envs.development]
ALLOWED_HOSTS = { "$insert" = "example.localhost" }

# These settings would be included when the `ENVIRONMENT` environment variable is "production"
[tool.django.envs.production]
DEBUG = false
ALLOWED_HOSTS = { "$insert" = "example.com" }

Features 🤩

Variables

Use ${SOME_VARIABLE_NAME} to use an existing setting as a value.

[tool.django]
GOOD_IPS = ["127.0.0.1"]
ALLOWED_HOSTS = "${GOOD_IPS}"  # note: this needs to be quoted as a string to be valid TOML, but will be converted into a `list`

Apps

[tool.django.apps.{ANY_NAME_HERE}] sections of the TOML file can be used to group settings together. They can be named anything. They will override any settings in [tool.django].

[tool.django.apps.tailwind-cli]
TAILWIND_CLI_USE_DAISY_UI = true
TAILWIND_CLI_SRC_CSS = ".django_tailwind_cli/source.css"

Environments

The [tool.django.envs.{ENVIRONMENT_NAME}] section of the TOML file will be used when {ENVIRONMENT_NAME} is set to the ENVIRONMENT environment variable. For example, ENVIRONMENT=production python manage.py runserver will load all settings in the [tool.django.envs.production] section. There settings will override any settings in [tool.django.apps.*] or [tool.django].

[tool.django]
ALLOWED_HOSTS = ["127.0.0.1"]

[tool.django.envs.development]
ALLOWED_HOSTS = ["example.localhost"]

[tool.django.envs.production]
ALLOWED_HOSTS = ["example.com"]

Special operations 😎

By default, special operations are denoted by an inline table, (aka a dictionary) with a key that starts with a $, e.g. { "$value" = "1" }.

Path

Converts a string to a Path object by using a $path key. Handles relative paths based on the location of the parsed TOML file.

[tool.django]
BASE_DIR = { "$path" = "." }
PROJECT_DIR = { "$path" = "./your_project_folder" }
REPOSITORY_DIR = { "$path" = "./.." }

Environment Variable

Retrieve variables from the environment by using an $env key. Specify an optional $default key for a fallback value.

[tool.django]
EMAIL_HOST_PASSWORD = { "$env" = "SECRET_PASSWORD" }
SECRET_KEY = { "$env" = "SECRET_KEY", "$default" = "this-is-a-secret" }

Arrays

Add items to an array by using the $insert key.

[tool.django]
ALLOWED_HOSTS = { "$insert" = "127.0.0.1" }

Specify the index of the new item with the $index key.

[tool.django]
ALLOWED_HOSTS = { "$insert" = "127.0.0.1", "$index" = 0 }

Integer Access

Modify specific elements of an array by using numeric sub-keys. This is particularly useful for overriding individual items in a list from different sections (like envs).

[tool.django.TEMPLATES.0]
BACKEND = "django.template.backends.django.DjangoTemplates"
DIRS = []
APP_DIRS = true

If the array already exists, the specified index will be updated. If it does not exist, a new array will be created with the specified values.

Operators now work at any depth, which is especially useful for nested Django settings like DATABASES or CACHES.

[tool.django.DATABASES.default]
# This will insert an option into the existing default database configuration
OPTIONS = { "$insert" = "some_option" }

None

Specify None for a variable with a $none key. The value must be truthy, i.e. true or 1 (even though the value won't get used).

[tool.django]
EMAIL_HOST_PASSWORD = { "$none" = 1 }

Value

Specifies a value for a variable.

[tool.django]
SITE_ID = { "$value" = 1 }

Two styles are supported for parsing database and cache URLs: special and cast.

Special

Use the $db or $cache operator.

[tool.django]
DATABASES = { default = { "$db" = "postgres://user:pass@localhost:5432/dbname" } }
CACHES = { default = { "$cache" = "redis://127.0.0.1:6379/1" } }

Cast

Use $value and $type (useful when combining with other operators like $env).

[tool.django]
DATABASES = { default = { "$value" = "sqlite:///:memory:", "$type" = "db" } }

# Combining with environment variables
CACHES = { default = { "$env" = "REDIS_URL", "$type" = "cache" } }

$type can be used as an additional operator with any other operator.

[tool.django]
SITE_ID = { "$env" = "SITE_ID", $type = "int" }
[tool.django]
SITE_ID = { "$value" = "1", $type = "int" }

Example Integrations 💚

Django

This will override any variables defined in settings.py with settings from the TOML files.

# settings.py
from dj_toml_settings import configure_toml_settings

...

configure_toml_settings(data=globals())

nanodjango

# app.py
from pathlib import Path
from dj_toml_settings import get_toml_settings

base_dir = Path(__file__).resolve().parent
app = Django(**get_toml_settings(base_dir=base_dir))

...

coltrane

# app.py
from pathlib import Path
from django.core.management import execute_from_command_line
from dj_toml_settings import get_toml_settings
from coltrane import initialize

base_dir = Path(__file__).resolve().parent.parent
wsgi = initialize(**get_toml_settings(base_dir=base_dir))

if __name__ == "__main__":
    execute_from_command_line()

...

Precedence 🔻

This is the order that files and sections are parsed (by default). The later sections override the previous settings.

  1. pyproject.toml -> [tool.django]
  2. pyproject.toml -> [tool.django.apps.*]
  3. pyproject.toml -> [tool.django.envs.*] that match ENVIRONMENT environment variable
  4. django.toml -> [tool.django]
  5. django.toml -> [tool.django.apps.*]
  6. django.toml -> [tool.django.envs.*] that match ENVIRONMENT environment variable

Specify a TOML file 🤓

from pathlib import Path
from dj_toml_settings import get_toml_settings

base_dir = Path(__file__).resolve().parent
toml_settings = get_toml_settings(base_dir=base_dir, toml_settings_files=["custom-settings.toml"])
...

Test 🧪

  • uv install pip install -e .[dev]
  • just test

Inspiration 😍

Metadata

Release files for dj-toml-settings 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dj-toml-settings 0.6.0
File Size Uploaded
dj_toml_settings-0.6.0.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dj-toml-settings 0.6.0
File Interpreter ABI Platform
dj_toml_settings-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 23.7 kB

Release files / dj_toml_settings-0.6.0.tar.gz

Download URL dj_toml_settings-0.6.0.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
272327d297f7c700f75c29a51a46cd2df041264d79c5b34fc459c0811288b5a3
BLAKE2b-256 checksum
How to use checksums
07a2fc6b710a670ca71479b3803862755e407d8134570a0a1d76e8e006f7cab9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 26, 2026.

Transparency log

Release files / dj_toml_settings-0.6.0-py3-none-any.whl

Download URL dj_toml_settings-0.6.0-py3-none-any.whl
Size 12.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
54ba79242d7af712856684d65ae047fbe4d13710c04cc7f0734473753e585a46
BLAKE2b-256 checksum
How to use checksums
7e84ce7800761dc3414bb8321d8ba093efad674a05d92ae7ac4cf20c07380fba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 26, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page