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

Str*_*ker 2 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
Run Code Online (Sandbox Code Playgroud)

管理员

  from django.contrib import admin
  from .models import Course   

  @admin.register(Course)
  class CourseAdmin(admin.ModelAdmin):
      list_display = ('title', 'description', 'get_date',)
Run Code Online (Sandbox Code Playgroud)

尝试了多种组合以导入日期/时间,但仍然出现错误,如图所示。 在此处输入图片说明

如果我使用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
Run Code Online (Sandbox Code Playgroud)

预期结果将在人工时间内显示created_at和Updated_at。显示

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

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

在此处输入图片说明

Int*_*nox 9

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

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

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

在Django DOCS上检查它。


Min*_*Web 9

结果证明模板过滤器可以直接从你的 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.date)
Run Code Online (Sandbox Code Playgroud)

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


FAC*_*ode 5

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

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

    def get_date(self):
        time = datetime.now()
        if self.created_at.day == time.day:
            return str(time.hour - self.created_at.hour) + " hours ago"
        else:
            if self.created_at.month == time.month:
                return str(time.day - self.created_at.day) + " days ago"
            else:
                if self.created_at.year == time.year:
                    return str(time.month - self.created_at.month) + " months ago"
        return self.created_at
Run Code Online (Sandbox Code Playgroud)

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

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