Specializing templates based on tenants

Multitenant aware filesystem template loader

The classical Django filesystem template loader cannot make the search path for template vary based on the current tenant so it’s needed to use a special one which adapt the search path based on the tenant. For using it add it to your TEMPLATE_LOADERS setting.

TEMPLATE_LOADERS = (
    'tenant_schemas.template_loaders.FilesystemLoader',
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader'
)

This loader is looking for templates based on the setting MULTITENANT_TEMPLATE_DIRS instead of the path in TEMPLATE_DIRS. Templates are not searched directly in each directory template_dir but in the directory os.path.join(template_dir, tenant.domain_url). If template_dir contains a %s formatting placeholder the directory used is template_dir % tenant.domain_url so that you can store your templates in a subdirectory of your tenant directory. Like with the Django FilesystemLoader the first found file is returned.

Multitenant aware cached template loader

If you are using template caching with the multitenant filesystem loader it is not gonna work as the cache is ignoring the tenant. So the first template loaded for any tenant will be returned for all other tenants. To remediate to this problem you can use a new loader whose cache is based on the template path and the primary key of the tenant model.

The multitenant cached loader works exactly like the Django cached loader but is tenant aware.

TEMPLATE_LOADERS = (
    ('tenant_schemas.template_loaders.CachedLoader', (
      'tenant_schemas.template_loaders.FilesystemLoader',
      'django.template.loaders.filesystem.Loader',
      'django.template.loaders.app_directories.Loader')),
)