我将日期存储为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
。
这就是我想要发生的事情:
FlexibleDateField
中作为
格式为yyyymmdd
的整数。20100416
- > 2010年4月16日; 20100400
- > 2010年4月; 20100000
- > 2010.这
当我没有打电话时也适用
直接,例如当它被用作时
管理员中的标题
(http://example.org/admin/app_name/model_name/
)。我不知道这些具体事情是否可行。
我已经编写了一个可以执行此功能的模板过滤器 -
({{object.flexibledate|flexibledateformat}}
) -
但是每次我想输出其中一个值时,我宁愿不必调用过滤器。除了输出表格外,我几乎不想看到这个数字。
答案 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)