Есть ли способ настроить отображение значения настраиваемого поля модели в шаблоне? - PullRequest
0 голосов
/ 15 апреля 2010

Я сохраняю даты в виде целочисленного поля в формате ГГГГММДД, где месяц или день необязательны.

У меня есть следующая функция для форматирования числа:

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.

Я бы хотел, чтобы это произошло:

  1. Я храню то, что я называю "Гибким Дата "в FlexibleDateField как целое число в формате yyyymmdd.
  2. Я предоставляю форму, которая включает FlexibleDateField и значение остается целым числом, так что функции необходимо для проверки его и рендеринг в работе виджетов правильно.
  3. Я называю это в шаблоне, как в {{object.f Flexibledate}} и он отформатирован в соответствии с Правила гибкого форматирования: 20100416 -> 16 апреля 2010 г .; 20100400 -> апрель 2010 г .; 20100000 -> 2010. Это также применяется, когда я не звоню непосредственно, например, когда он используется как заголовок в админке (http://example.org/admin/app_name/model_name/).

Я не знаю, возможны ли эти конкретные вещи.

Также

Я уже написал шаблонный фильтр, который может выполнять эту функцию - ({{object.flexibledate|flexibledateformat}}) - но я бы предпочел не вызывать фильтр каждый раз, когда я хочу вывести одно из этих значений. За исключением вывода формы, я почти никогда не хочу видеть число.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2010

Я думаю, что наиболее djangoish способ достижения подобного эффекта - это определение пользовательского метода для модели:

class Model(models.Model):
    date = models.IntegerField()
    ...

    def flexibledate(self):
        return flexibledateformat(self.date)

Вы можете использовать его в таком шаблоне:

{{ r.flexibledate }}

Мне также интересно, почему вы используете IntegerField вместо собственного DateTimeField.

Обновление: Вы все еще можете использовать пользовательский метод в качестве опции для list_display в Django Admin. Если вы хотите, чтобы заголовок столбца говорил что-то еще, тогда просто в имени метода используйте опцию «short_description», например:

class Model(models.Model):
    date = models.IntegerField()
    ...

    def flexibledate(self):
        return flexibledateformat(self.date)
    flexibledate.short_description = 'Date'

и затем вы просто используете его так же, как и обычное поле:

class YourModelAdmin(admin.ModelAdmin):
    list_display = ('title', 'flexibledate')
admin.site.register(YourModel, YourModelAdmin)
0 голосов
/ 16 апреля 2010

Это не обязательно, прочитайте о очеловечив и фильтруйте тег время

...