有没有办法自定义模板中显示自定义模型字段的值的方式?

时间:2010-04-15 19:26:36

标签: django model field

我将日期存储为YYYYMMDD格式的整数字段,其中月份或日期是可选的。

我有以下格式化数字的功能:

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(name ='foo',date = 20100400) 当在表单中处理时,值为20100400但是当使用{{ r.date }}在模板中输出时,它会显示为“2010年4月”。

进一步澄清

我通常使用datetime来存储日期/时间值。在这种特定情况下,我需要记录非特定日期:“ x 发生在2009年”,“ y 发生在1996年6月的某个时间” 。

在保留日期字段的大部分功能(包括排序和过滤)的同时,最简单的方法是使用格式为yyyymmdd的整数。这就是为什么我使用的是IntegerField而不是DateTimeField

这就是我想要发生的事情:

  1. 我存储了我称之为“灵活的” 日期“在FlexibleDateField中作为 格式为yyyymmdd的整数。
  2. 我渲染一个包含a的表单 FlexibleDateField和值 仍然是一个整数,以便功能 验证它和 在小部件中呈现它 正确。
  3. 我在模板中调用它, 如同{{object.flexibledate}}和 它按照格式进行格式化 flexibledateformat规则:20100416 - > 2010年4月16日; 20100400 - > 2010年4月; 20100000 - > 2010.这 当我没有打电话时也适用 直接,例如当它被用作时 管理员中的标题 (http://example.org/admin/app_name/model_name/)。
  4. 我不知道这些具体事情是否可行。

    另外

    我已经编写了一个可以执行此功能的模板过滤器 - ({{object.flexibledate|flexibledateformat}}) - 但是每次我想输出其中一个值时,我宁愿不必调用过滤器。除了输出表格外,我几乎不想看到这个数字。

2 个答案:

答案 0 :(得分:2)

我认为实现类似效果的最多 djangoish 方法是在模型上定义自定义方法:

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

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

您可以在以下模板中使用它:

{{ r.flexibledate }}

我也想知道你为什么使用的是IntegerField而不是原生的DateTimeField。

更新:您仍然可以在Django Admin中将自定义方法用作list_display的选项。如果您希望列标题说出其他内容,那么只需使用方法的名称使用“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)

答案 1 :(得分:-1)

没有必要,请阅读humanize和filtertag time