如何从 Django 模板中的 API 响应转换日期

Posted

技术标签:

【中文标题】如何从 Django 模板中的 API 响应转换日期【英文标题】:How to convert date from an API response in a Django Template 【发布时间】:2020-01-05 15:37:18 【问题描述】:

我有一个 API 在我的一个模板中填充一些数据。日期的输出是"2019-08-30T08:22:32.245-0700" 怎样才能让日期像DD/MM/YY 一样读取

我尝试了一些模板 date: 类型的东西,类似于你对 Jekyll 所做的,但没有任何效果

这就是我从 API 响应中显示它的方式。

<td class="text-center"> ticket.fields.updated </td>

我试过类似的东西:

<td class="text-center"> ticket.fields.updated | date: "Y,D,M " </td>

尝试:

class PostDetailView(DetailView):
    '''
        This view will hold infomation from Pendo / Salesforce and Jira
        using their APIs to display the infomation.
    '''
    model = Post
    template_name = 'clients/post_detail.html'

    def render_to_response(self, context, **response_kwargs):
        # pendo api
        pendo_result = api_calls.pendo_data()
        context['pendo_data'] = pendo_result

        # jira api
        jira_result = api_calls.jira_data()
        context['jira_data'] = jira_result['issues']

        return super().render_to_response(context, **response_kwargs)

    @register.filter(expects_localtime=True, is_safe=False)
    def date(value, arg=None):

        jira_api = api_calls.jira_data()
        jira_date = jira_api['fields']['updated']

        if value in (None, ''):
            return ''

        if isinstance(value, str):
            api_date_format = jira_date
            value = datetime.datetime.strptime(value, api_date_format)

        try:
            return formats.date_format(value, arg)
        except AttributeError:
            try:
                return format(value, arg)
            except AttributeError:
                return ''

【问题讨论】:

使用|date: 模板过滤器时得到什么输出? 【参考方案1】:

如果从外部 API 检索,您的数据可能是字符串而不是 Python datetime.date 对象。

在这种情况下,您的选择可能是:

自定义模板过滤器,将字符串转换为日期并将其格式化为所需格式的字符串 在您的视图中将字符串转换为日期并将其格式化为所需格式的字符串

如果您想要custom template filter,我会先从built-in date filter 复制源代码,然后添加几行将字符串转换为日期时间,然后将这些日期时间转换回具有新格式的字符串。

可能是这样,在一个名为 your_app/templatetags/custom_tags.py 的文件中:

from django import template
from django.utils import formats
register = template.Library()

@register.filter(expects_localtime=True, is_safe=False)
def custom_date(value, arg=None):
    if value in (None, ''):
        return ''

    if isinstance(value, str):
        api_date_format = '%Y-%m-%dT%H:%M:%S'
        value = datetime.datetime.strptime(value, api_date_format)

    try:
        return formats.date_format(value, arg)
    except AttributeError:
        try:
            return format(value, arg)
        except AttributeError:
            return ''

然后像这样在你的模板中使用:

% load custom_tags %

<td class="text-center">
     ticket.fields.updated|custom_date:"Y,D,M" 
</td>

【讨论】:

我相信它是一个字符串...这需要正则表达式转换成更好的格式吗?你能解释一下自定义模板过滤器吗?以及我将如何去做,因为我不喜欢正则表达式哈哈 类似于我的编辑 Ralf?我不确定这里是什么意思api_date_format = '????' 所以我在上面猜了一下。 @mrpbennett 我编辑了我的答案;如果您想使用自定义模板过滤器,则需要在单独的文件中定义此过滤器(例如 docs 说)并加载到要使用的模板中。如果你走这条路,通常你的视图不需要修改 这太棒了!!谢谢人...但我收到一个错误unconverted data remains: .745-0700 似乎'%Y-%m-%dT%H:%M:%S' 没有涵盖所有我可能弄错了。 @mrpbennett 看看in this table here 了解如何表示微秒部分

以上是关于如何从 Django 模板中的 API 响应转换日期的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在新模板中的另一个模型上使用 CreateView 的 form_valid() 返回的响应?

如何访问由 AJAX 响应返回到模板的查询集 - Django

如何在模板中调用 api [关闭]

从 typescript 中的 API 响应正确转换日期

防止 Django 模板表单中的重定向

如何将JSON响应转换为Java List-使用Rest Assured进行API测试