Встроенные в Django шаблонные загрузчики (описанные в секции «Загрузка шаблонов») покрывают практически все ваши нужды, но в случае необходимости будет достаточно просто реализовать свой собственный загрузчик. Например, вы можете загружать шаблоны из базы данных или напрямую из репозитория Subversion, или из ZIP архива.
Ожидается, что каждый шаблонный загрузчик, описанный в параметре
TEMPLATE_LOADERS конфигурационного файла,
будет функцией вида:
load_template_source(template_name, template_dirs=None)
Аргумент template_name является именем шаблона,
который требуется загрузить (имя передаётся в
loader.get_template() или
loader.select_template()), а
template_dirs является необязательным списком
каталогов, в которых следует производить поиск вместо указанных
в TEMPLATE_DIRS.
Если загрузчик может успешно загрузить шаблон, он должен возвратить кортеж (template_source, template_path). Здесь template_source является шаблонной строкой, которая будет скомпилирована шаблонной системой, а template_path — путь до загружаемого шаблона. Этот путь может отображаться пользователю в отладочных целях.
Если загрузчик не может загрузить шаблон, он должен вызывать исключение django.template.TemplateDoesNotExist.
Функция каждого загрузчика должна также иметь атрибут is_usable. Это значение булевого типа, которое информирует шаблонную систему о том, доступен ли этот загрузчик текущему проекту. Например, загрузчик, который может загружать шаблоны из питонских яиц ;) устанавливает значение False для этого атрибута, если модуль pkg_resources не установлен, так как этот модуль необходим для его работы с яйцами.
Пример должен всё прояснить. Ниже представлена функция
шаблонного загрузчика, который может загружать шаблоны из ZIP
файла. Он использует свой конфигурационный параметр
TEMPLATE_ZIP_FILES в качестве пути поиска
вместо TEMPLATE_DIRS и ожидает, что каждый
путь должен быть ZIP файлом, который содержит шаблоны:
import zipfile
from django.conf import settings
from django.template import TemplateDoesNotExist
def load_template_source(template_name, template_dirs=None):
"""Template loader that loads templates from a ZIP file."""
template_zipfiles = getattr(settings, "TEMPLATE_ZIP_FILES", [])
# Try each ZIP file in TEMPLATE_ZIP_FILES.
for fname in template_zipfiles:
try:
z = zipfile.ZipFile(fname)
source = z.read(template_name)
except (IOError, KeyError):
continue
z.close()
# We found a template, so return the source.
template_path = "%s:%s" % (fname, template_name)
return (source, template_path)
# If we reach here, the template couldn't be loaded
raise TemplateDoesNotExist(template_name)
# This loader is always usable (since zipfile is included with Python)
load_template_source.is_usable = True
Для того, чтобы воспользоваться данным загрузчиком, его надо
добавить в параметр TEMPLATE_LOADERS. Если мы
разместили этот код в пакете mysite.zip_loader,
тогда надо добавить
mysite.zip_loader.load_template_source в параметр
TEMPLATE_LOADERS.
| Пред. | Уровень выше | След. |
| Расширение шаблонной системы | Начало | Использование встроенного шаблонного справочника |
0 комментариев | Оставьте комментарий