Python 如何在传递到模板之前在Django ListView中编辑输出
我有一个Django列表视图Python 如何在传递到模板之前在Django ListView中编辑输出,python,html,django,listview,Python,Html,Django,Listview,我有一个Django列表视图 class FirePageView(ListView): model = MyModel template_name = 'page.html' context_object_name = 'my_list' ordering = ['-timestamp'] 因此,我可以渲染一个表刚刚好,一切都在那里工作。但是,我希望应用一种转换,例如在将时间戳发送到模板之前,将所有时间戳从UTC更改为EST。这样,模板以EST而不是UTC显示
class FirePageView(ListView):
model = MyModel
template_name = 'page.html'
context_object_name = 'my_list'
ordering = ['-timestamp']
因此,我可以渲染一个表刚刚好,一切都在那里工作。但是,我希望应用一种转换,例如在将时间戳发送到模板之前,将所有时间戳从UTC更改为EST。这样,模板以EST而不是UTC显示时间。如何编辑ListView传递到模板中的内容?正如其他作者所说,模板标记最能解决您的特定用例(转换时间戳) 如果仍要修改数据,请查看djangos
MultipleObjectMixin
中使用的djangosListView
:
class MultipleObjectMixin(ContextMixin):
"""A mixin for views manipulating multiple objects."""
allow_empty = True
queryset = None
model = None
paginate_by = None
paginate_orphans = 0
context_object_name = None
paginator_class = Paginator
page_kwarg = 'page'
ordering = None
def get_queryset(self): # YOU CAN OVERRIDE THIS METHOD FOR YOUR USE
"""
Return the list of items for this view.
The return value must be an iterable and may be an instance of
`QuerySet` in which case `QuerySet` specific behavior will be enabled.
"""
if self.queryset is not None:
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = queryset.all()
elif self.model is not None:
queryset = self.model._default_manager.all()
else:
raise ImproperlyConfigured(
"%(cls)s is missing a QuerySet. Define "
"%(cls)s.model, %(cls)s.queryset, or override "
"%(cls)s.get_queryset()." % {
'cls': self.__class__.__name__
}
)
ordering = self.get_ordering()
if ordering:
if isinstance(ordering, str):
ordering = (ordering,)
queryset = queryset.order_by(*ordering)
return queryset
您可以钩住
get\u queryset()
方法并返回一个iterable,该iterable按照您想要的方式进行转换。使用这个钩子,您仍然可以使用通用的列表视图的所有优点
谢谢您的评论和回答。如果您对直接编辑查询集感兴趣,这本身可能很有用,请查看下面@Yves Hary的答案
对于我的用例,自定义模板标记()可以工作。如果您感兴趣,这是我的代码:
应用程序内/templatetags/timezone_conversion.py
import pytz
from django import template
register = template.Library()
@register.filter(name='timezone_conversion_filter')
def timezone_conversion_filter(time, timezone):
tz = pytz.timezone(timezone)
print(time, tz, )
local_dt = time.astimezone(tz)
print(time, tz)
return local_dt.strftime("%b %e, %Y, %I:%M %p")
然后在html页面中
{% load timezone_conversion %}
{{ your_datetime|timezone_conversion_filter:"US/Pacific" }}
这是你应该在模板上应用的东西,可能有一个。帖子中的注释可能会对你有所帮助,所以看一看。关于时间戳的转换:如果你使用django的国际化功能,数据库中所有UTC时间戳都会转换成本地格式!所以,如果你激活了本地化和国际化,你不需要做任何事情。