Функция lazy
Функция lazy применяется для создания отложенных объектов,
которые вычисляются только в момент доступа к их значению.
Это особенно полезно при работе с шаблонами и формами,
где необходимо передавать вызовы функций, которые должны
выполниться позднее. Функция принимает вызываемый объект
и возвращает обёртку, которая при обращении вызывает
исходный объект с переданными аргументами.
Синтаксис
from django.utils.functional import lazy
lazy(func, *resultclasses)(*args, **kwargs)
Параметры
Функция lazy принимает два основных аргумента:
func - вызываемый объект, выполнение которого
будет отложено до момента обращения к результату.
resultclasses - список классов, которые определяют
тип возвращаемого значения и поведение при операциях
сравнения или преобразования.
Пример
Давайте создадим отложенную функцию, которая возвращает текущее время только при обращении к результату:
from django.utils.functional import lazy
from datetime import datetime
def get_current_time():
return datetime.now().strftime("%H:%M:%S")
lazy_time = lazy(get_current_time, str)()
# Функция не выполнилась при создании
# Выполнится только при обращении
print(lazy_time)
Результат выполнения кода:
"14:25:30"
Пример
Давайте используем lazy для передачи отложенного
вызова в модель с помощью поля по умолчанию:
from django.db import models
from django.utils.functional import lazy
from datetime import datetime
def get_default_date():
return datetime.now().date()
class Article(models.Model):
title = models.CharField(max_length=100)
created_at = models.DateField(
default=lazy(get_default_date, datetime)
)
def __str__(self):
return self.title
Результат выполнения кода при создании объекта:
from myapp.models import Article
article = Article(title="New Article")
print(article.created_at)
Результат выполнения кода:
"2026-09-07"
Пример
Давайте создадим отложенную строку с преобразованием регистра для использования в шаблонах:
from django.utils.functional import lazy
def process_text(text):
return text.strip().upper()
lazy_text = lazy(process_text, str)(" hello world ")
# Выполнится только при обращении
print(lazy_text)
Результат выполнения кода:
"HELLO WORLD"
Смотрите также
-
функция
mark_safe,
которая помечает строку как безопасную для вывода в HTML -
функция
escape,
которая экранирует специальные HTML-символы -
функция
format_html,
которая форматирует строку с безопасным HTML-выводом -
декоратор
cached_property,
который кеширует результат выполнения метода