Интересно, можно ли изменить значение, возвращаемое из набора запросов, перед его отправкой в шаблон.
Скажем, например, у вас есть куча записей
Date | Time | Description
10/05/2010 | 13:30 | Testing...
и т.д ...
Однако в зависимости от дня недели время может измениться. Однако это статично. Например, в понедельник время ВСЕГДА 15: 00.
Теперь вы можете добавить еще одну таблицу для настройки особых случаев, но для меня это кажется излишним, так как это правило. Как бы вы заменили это значение перед отправкой в шаблон?
Я думал об использовании новых тегов if (если day = 1), но это скорее бизнес-логика, а не презентация.
Проверено это в пользовательском теге шаблона
def render(self, context):
result = self.model._default_manager.filter(from_date__lte=self.now).filter(to_date__gte=self.now)
if self.day == 4:
result = result.exclude(type__exact=2).order_by('time')
else:
result = result.order_by('type')
result[0].time = '23:23:23'
context[self.varname] = result
return ''
Однако он по-прежнему отображает результаты из БД. Это как-то связано с «ленивой» оценкой шаблонов?
Спасибо!
Обновление Ответ на комментарии ниже:
Он не хранится неправильно в БД, он хранится правильно. Однако есть небольшой случай, когда значение необходимо изменить.
Так, например, у меня есть Дата и До, мой запрос проверяет, находится ли сегодняшняя дата между ними. Теперь с этим они могли бы установить дату от даты до даты в течение всего года, и особые случаи (как, например, понедельники) были убраны. Однако, если вы хотите сохранить в БД, вам придется захватить еще несколько записей, чтобы удовлетворить побочный случай. Т.е. вы бы собирали ту же информацию только для того, чтобы обслуживать тот 1 день, когда время меняется. (И время всегда меняется в один и тот же день и всегда одинаково)
Обновление с решением (на основе ответа KillianDS ниже)
В models.py я определил пользовательское свойство:
@property
def get_corrected_time(self):
from datetime import time
day = datetime.now().weekday()
if day == 0 or day == 1:
self.time = time(12,30)
return self.time
и в шаблоне
{{ object.get_corrected_time|time:"P" }}
Причина возврата объекта datetime.time, а не строки, заключается в том, что фильтры даты и времени django по умолчанию не будут работать со строкой.