Можно ли заменить значения в наборе запросов перед отправкой в ​​шаблон? - PullRequest
2 голосов
/ 24 апреля 2010

Интересно, можно ли изменить значение, возвращаемое из набора запросов, перед его отправкой в ​​шаблон. Скажем, например, у вас есть куча записей

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 по умолчанию не будут работать со строкой.

1 Ответ

4 голосов
/ 24 апреля 2010

Хорошо, без какого-либо точного примера (простая модель и понятный вариант использования помогли бы), я не уверен, но думаю, это то, что вы хотите сделать. В определении модели добавьте что-то вроде этого:

@property
def get_corrected_time(self):
    if today_is_monday:
        return '13:30'
    return str(self.time)

в вашем шаблоне вы можете назвать это {{object.get_corrected_time}}

Теперь я вижу в теге шаблона, что вы хотите сделать это, например, только для первого элемента в наборе запросов, вы можете легко сделать это следующим образом в шаблоне (вы также можете сделать это в методе view):

{% for object in list %}
{% if forloop.first %}
    {{ object.get_corrected_time }}
{% else %}
    {{ object.time }}
{% endif %}
{% endfor %}
...