django如何动态渲染?

想要一个计算时间差的功能, 数据库就是默认的 datetime.now 保存的。

现在通过models.objects.all() 获取了对象,传给模板

但模板循环显示出 是 201x年 x.x.x 这种格式。如果我需要显示 1天前 14小时前 15分钟前
逻辑是要写在view的请求函数内吗? 我个人感觉不是很规范。是不是要用js写到模板里才对?

clipboard.png

阅读 3.8k
3 个回答

django有自带的filter

{{ datetime|timesince }}

#settings设置中文显示
LANGUAGE_CODE = 'zh-CN'

尝试在view中写了一个loop并设置了属性,不知道 这种是不是django规范的开发写法呢?

import datetime


def get_time_offset(timestmp):
    n = 0
    t = '天'
    r = '{} {}前'

    offset = datetime.datetime.now() - timestmp.replace(tzinfo=None)

    s = offset.total_seconds()

    if 60 > s > 0:
        n = (offset.seconds)
        t = '秒'

    elif 60 * 60 > s > 60:
        n = s / 60
        t = '分钟'

    elif (60 * 60) * 24 > s > 60:
        n = s / 60 * 60
        t = '小时'

    elif 7 > offset.days > 1:
        n = (offset.days)
        t = '天'

    elif 30 > offset.days > 7:
        n = (offset.day / 7)
        t = '周'

    elif 360 > offset.days > 30:
        n = (offset.days / 30)
        t = '月'

    elif offset.days > 365:
        n = (offset.days / 365)
        t = '年'

    return r.format(int(n), t)


def all_question(request):
    quest_data = models.Question.objects.all()[:20]

    base_t = loader.get_template('base.html')
    head_t = loader.get_template('base_head.html')
    view_t = loader.get_template('quest_list_view.html')

    head_html = head_t.render({})

    for a in quest_data:
        a.after_time = get_time_offset(a.post_time)

    view_html = view_t.render({'quest_data': quest_data})

    view_html = base_t.render({'head': head_html, 'view': view_html})

    return HttpResponse(view_html)

服务端写一个公用的方法,计算下时间差把时间自己想要的字符串,再传给模板。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题