Specializing templates based on tenants

Multitenant aware filesystem template loader

The regular Django filesystem template loader does not vary the search path based on the current tenant. We provide a specialised version which does adapt. To use it add, add tenant_schemas.template_loaders.FilesystemLoader to your TEMPLATES configuration.

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": ["/path/to/templates"],
        ...
        "OPTIONS": {
            ...
            "loaders": [
                "tenant_schemas.template_loaders.FilesystemLoader",
                "django.template.loaders.app_directories.Loader",
            ]
        }
    }
]

MULTITENANT_TEMPLATE_DIRS = ["/path/to/tenant/templates/%s"]

Like with the Django FilesystemLoader the first file found is used. The loader will first search for templates in the paths specified in MULTITENANT_TEMPLATE_DIRS before falling back to the static locations in the DIRS option.

The replacement string %s will be transposed with the tenant domain_url in MULTITENANT_TEMPLATE_DIRS.

Multitenant aware cached template loader

To use template caching with the FilesystemLoader, you must combine it with the CachedLoader. If you do not, the first template located for any tenant is used for all following tenants.

The CachedLoader prefixes the cache key with the schema name of the tenant.

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": ["/path/to/templates"],
        ...
        "OPTIONS": {
            ...
            "loaders": [
                (
                    "tenant_schemas.template_loaders.CachedLoader",
                    (
                        "tenant_schemas.template_loaders.FilesystemLoader",
                        "django.template.loaders.app_directories.Loader",
                    )
                )
            ]
        }
    }
]