Tengo un DatetimeField que destaco en el administrador de django en función de la antigüedad en comparación con ahora ().
def valid_up_to_column(self): now = datetime.datetime.now(datetime.timezone.utc) delta = (now - self.valid_up_to).seconds if delta > 900: colour = '#FF0000' # red else: return self.valid_up_to return format_html('<span style="background-color: {}">{}</span>', colour, self.valid_up_to)Cuando se usa format_html, la fecha y hora se representa como formato UTC 2017-01-01 00:00+00:00 sin procesar, pero para el otro caso, la configuración regional de Django se hace cargo y la formatea según la configuración regional, por ejemplo, 1 de enero de 2017, medianoche.
¿Cómo puedo formatear la fecha y hora para que tenga el mismo formato que Django antes de pasarla a format_html() ?
Intenté usar strftime (settings.DATETIME_FORMAT) pero este es el django DATETIME_FORMAT, no es lo mismo que el formato de cadena de Python.
Entendido, hay una función de formato útil, solo pásele la configuración DATETIME_FORMAT, por lo que si no está configurada, el formato L10N lo tomará desde aquí.
from django.utils.dateformat import format datetime_str = format(self.valid_up_to, settings.DATETIME_FORMAT)La misma función podría usarse para dar formato a los valores de fecha, fecha y hora:
from django.utils.formats import localize formatted_value = localize(value) Parte relacionada con la fecha y hora de la función localize() :
def localize(value, use_l10n=None): ... elif isinstance(value, datetime.datetime): return date_format(value, 'DATETIME_FORMAT', use_l10n=use_l10n) elif isinstance(value, datetime.date): return date_format(value, use_l10n=use_l10n) elif isinstance(value, datetime.time): return time_format(value, 'TIME_FORMAT', use_l10n=use_l10n) ...