在Django表格2中解析ISO 8601日期格式

时间:2018-09-06 06:06:46

标签: python django datetime iso8601 django-tables2

我正在使用django tables2,其中:

  

请注意,格式使用Django的日期模板标记语法。

根据django date,通过格式字符串'c'选择了ISO 8601:

  

c ISO 8601格式:2008-01-02T10:30:00.000123 + 02:00

这就是我要做的:

import django_tables2 as tables

...

    created = tables.DateTimeColumn(format='c')

但这不起作用(表中的created列显示为空,表明存在解析问题)

这是来自API的数据:

"created": "2018-09-05T14:00:35.672433Z",

实际上来自DRF,默认情况下使用:

  

format-表示输出格式的字符串。如果未指定,   该默认值与DATETIME_FORMAT设置键相同,   除非设置,否则将为“ iso-8601”

总而言之,我的问题是:

如何用Django table2解析iso8601?

编辑

表填充如下:

import django_tables2 as tables
from django.utils.translation import ugettext as _


class ExpansionTable(tables.Table):
    human = tables.Column()
    created = tables.DateTimeColumn(format='c')
    size = tables.Column()
    description = tables.Column()
    output = tables.Column()

    class Meta:
        attrs = {'class': 'table paleblue'}
        order_by = "-created"

这将显示列的空值(created)。其余各栏均按预期显示。

1 个答案:

答案 0 :(得分:1)

django-tables2期望DateTimeColumn的传入数据是实际的datetime实例,这是实现:

def __init__(self, format=None, short=True, *args, **kwargs):
    if format is None:
        format = "SHORT_DATETIME_FORMAT" if short else "DATETIME_FORMAT"
    template = '{{ value|date:"%s"|default:default }}' % format
    super(DateTimeColumn, self).__init__(template_code=template, *args, **kwargs)

所以我想您有两种选择:

  1. 编写自定义列或使用render_foo methods来确保数据在表格中正确呈现
  2. 在将数据传递到django-tables2之前,将字符串值转换为datetime实例。

我建议使用2。