如何在django admin中显示人类时间(x天前或现在)?

时间:2016-10-31 15:34:24

标签: django datetime django-admin

如何在django admin 中显示facebook / twitter中使用的时间/日期格式?

from django.db import models
from datetime import datetime


class Course(models.Model):

      date = models.DateTimeField(auto_now_add=True)
      title = models.CharField(max_length=255)
      description = models.TextField()

      def get_date(self):
          time = datetime.now()
          if self.date.day == time.day:
              return str(time.hour - self.date.hour) + " hours ago"
          else:
              if self.month == time.month:
                   return str(time.day - self.date.day) + " days ago"

          return self.date

      def __str__(self):
          return self.title

Admin.py

  from django.contrib import admin
  from .models import Course   

  @admin.register(Course)
  class CourseAdmin(admin.ModelAdmin):
      list_display = ('title', 'description', 'get_date',)

尝试了一些组合来导入日期/时间,但仍然会出现错误,如图所示。 enter image description here

如果我使用get_date:我收到以下错误:

AttributeError at /admin/courses/course/
'Course' object has no attribute 'month'
Request Method: GET
Request URL:    http://localhost:8000/admin/courses/course/
Django Version: 1.10.5
Exception Type: AttributeError
Exception Value:    
'Course' object has no attribute 'month'
Exception Location: /courses/models.py in get_date, line 17

在人类时间显示created_at和updated_at的预期结果。 显示

  • 2天前
  • 现在
  • 几分钟前

预期结果:2天前,或3小时前。或者更好,几个小时前。

enter image description here

3 个答案:

答案 0 :(得分:6)

结果是可以直接从Python代码库访问模板过滤器。像这样:

from django.contrib.humanize.templatetags import humanize

class Example(models.Model):
    date = models.DateTimeField(auto_now_add=True)

    def get_date(self):
        return humanize.naturaltime(self.created_at)

get_date()函数也可以位于您的CourseAdmin类中。

答案 1 :(得分:5)

有一个可接受的答案,但是我想建议另一个人来这里寻求可在模板中使用的解决方案。

Django有一个名为django.contrib.humanize的contrib软件包。将此添加到您的INSTALLED_APPS,然后在模板中使用{% load humanize %},之后,您可以使用value|naturaltime模板标记。 “值”将是您的日期。

假设content.created,其中包含您内容的创建日期。这是一个datetimefield对象。因此,您可以使用以下命令:content.created|naturaltime。它将日期从例如2018年7月14日11:30转换为“ 3天1小时前”。

Check it on Django DOCS.

答案 2 :(得分:3)

您可以在模型中使用额外的方法,如下所示:

min-height

或者您可以为此创建一些utils函数,如果您想在更多情况下使用它,只需在模型方法中使用它

这是Django管理员的文档,在这里您可以找到所需的一切: https://docs.djangoproject.com/en/1.10/ref/contrib/admin/