Я сохраняю даты в виде целочисленного поля в формате ГГГГММДД, где месяц или день необязательны.
У меня есть следующая функция для форматирования числа:
def flexibledateformat(value):
import datetime, re
try:
value = str(int(value))
except:
return None
match = re.match(r'(\d{4})(\d\d)(\d\d)$',str(value))
if match:
year_val, month_val, day_val = [int(v) for v in match.groups()]
if day_val:
return datetime.datetime.strftime(datetime.date(year_val,month_val,day_val),'%b %e, %Y')
elif month_val:
return datetime.datetime.strftime(datetime.date(year_val,month_val,1),'%B %Y')
else:
return str(year_val)
Что приводит к следующим выводам:
>>> flexibledateformat(20100415)
'Apr 15, 2010'
>>> flexibledateformat(20100400)
'April 2010'
>>> flexibledateformat(20100000)
'2010'
Поэтому мне интересно, есть ли функция, которую я могу добавить в класс поля модели, которая автоматически вызовет flexibledateformat
.
Так что, если есть запись
r = DataRecord (имя = 'foo', дата = 20100400)
при обработке в форме значение будет 20100400
, но при выводе в шаблон с использованием {{ r.date }}
оно будет отображаться как «апрель 2010».
Дополнительные разъяснения
Я обычно использую datetime для хранения значений даты / времени. В этом конкретном случае мне нужно записать неспецифические даты : « x произошло в 2009 году», « y произошло в июне 1996 года».
Самый простой способ сделать это, сохранив при этом большинство функций поля даты, включая сортировку и фильтрацию, - использовать целое число в формате yyyymmdd
. Вот почему я использую IntegerField
вместо DateTimeField
.
Я бы хотел, чтобы это произошло:
- Я храню то, что я называю "Гибким
Дата "в
FlexibleDateField
как
целое число в формате yyyymmdd
.
- Я предоставляю форму, которая включает
FlexibleDateField и значение
остается целым числом, так что функции
необходимо для проверки его и
рендеринг в работе виджетов
правильно.
- Я называю это в шаблоне,
как в {{object.f Flexibledate}} и
он отформатирован в соответствии с
Правила гибкого форматирования:
20100416
-> 16 апреля 2010 г .; 20100400
-> апрель 2010 г .; 20100000
-> 2010. Это
также применяется, когда я не звоню
непосредственно, например, когда он используется как
заголовок в админке
(http://example.org/admin/app_name/model_name/
).
Я не знаю, возможны ли эти конкретные вещи.
Также
Я уже написал шаблонный фильтр, который может выполнять эту функцию -
({{object.flexibledate|flexibledateformat}}
) -
но я бы предпочел не вызывать фильтр каждый раз, когда я хочу вывести одно из этих значений. За исключением вывода формы, я почти никогда не хочу видеть число.