【问题标题】:Hiding milliseconds from timezone.now() (In HTML)从 timezone.now() 中隐藏毫秒(在 HTML 中)
【发布时间】:2021-10-28 12:06:41
【问题描述】:

我正在构建一个 BlogApp 并且我正在实现 expiring post 的功能,因此帖子将隐藏在 2 days 中,因此我在帖子中向用户显示 remaining time

剩余时间显示完美,但它也显示毫秒(我试图隐藏)

输出是这样的:-

2 天,23:43:33.271449

views.py

from django.utils import timezone
from datetime import timedelta

def blogpost_detail(request,blogpost_id):
    blog = get_objects_or_404(BlogPost,pk=blogpost_id)

    remaining_time = blog.blog_date_added - timezone.now() + timedelta(days=2)

    context = {'remaining_time':remaining_time,'blog':blog}
    return render(request, 'blogpost_detail.html', context}

我试图显示为输出的内容:-

我想表现得像:-

还剩 2 天 23 小时

我尝试了什么:-

/不支持的操作数类型:“datetime.datetime”和“int”

  • 然后我尝试使用time:"h:i a"{{ blog.blog_date_added|time:"h:i a" }} 一样将millisecondstemplate 隐藏起来 但它没有显示任何输出。

  • 当我尝试添加 naturaltime 之类的 {{ blog.blog_date_added|naturaltime }} 时,它会显示相同的输出。

  • 当我尝试像{{ blog.blog_date_added|timesince }} 一样添加timesince 时,它会显示:-

'datetime.timedelta' 对象没有属性'year'

任何帮助将不胜感激。提前谢谢你

【问题讨论】:

  • 这看起来像是 |naturaltime template filter
  • @WillemVanOnsem,当我添加 {{ blog.blog_date_added|naturaltime }} 时,它甚至不会改变输出。它显示相同的值
  • 此外,您还应该指定博客不再处于活动状态时的时间戳,因此在blog_date_added之后两天
  • 如果一直是两天,我会做一个属性,因为那时它是根据date_added字段计算的,因此不可能不一致。
  • @WillemVanOnsem,是的,总是两天,我绝不希望用户编辑 expire 日期

标签: python django datetime django-views


【解决方案1】:

我建议您在博客到期时向您的Blog 添加一个属性,例如:

from datetime import timedelta

class Blog(models.Model):
    # ⋮
    
    @property
    def expire_date(self):
        return self.blog_date_added + timedelta(days=2)

然后我们可以在模板中使用|naturaltime template filter

{% load humanize %}
{{ blog.expire_date|naturaltime }}

【讨论】:

  • 感谢它的工作。如果我尝试set a Boolean to False,那么当到期日期发生时,它将转向False。我可以像return self.bounty_date_announced + timedelta(days=7) return is_expired=False 那样做吗?
  • 您可以使用布尔值添加属性,也可以使用from django.db.models import BooleanField, ExpressionWrapper, Q 注释查询集; from django.db.models.functions import Now; Blog.objects.annotate(expired=ExpressionWrapper(Q(blog_date_added__lte=Now()-timedelta(days=2)), output_field=BooleanField()))(参见django-antipatterns.com/pattern/…)向由此查询集产生的Blogs 添加一个额外的字段。
  • 所以,你的意思是“我可以在models.py 中添加一个属性,我可以在DetailView 中使用ExpressionWrapperviews.py 中”?
  • @Lars:两者之一。属性可用于返回TrueFalse,但不能在过滤查询集时使用,在这种情况下,您可以使用.filter(blog_date_added__lte=Now()-timdelta(days=1)) 进行过滤,并且如果您想对项目进行注释,例如在以后的过滤中使用它, 你可以注释这些。在您需要的地方注释查询集可能更有意义,如果您只想检索“活动”Blog 帖子,请进行过滤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2012-05-16
  • 1970-01-01
  • 2016-03-16
  • 2012-06-08
相关资源
最近更新 更多