Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在传递到模板之前在Django ListView中编辑输出_Python_Html_Django_Listview - Fatal编程技术网

Python 如何在传递到模板之前在Django ListView中编辑输出

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显示

我有一个Django列表视图

class FirePageView(ListView):
    model = MyModel
    template_name = 'page.html'
    context_object_name = 'my_list'
    ordering = ['-timestamp']

因此,我可以渲染一个表刚刚好,一切都在那里工作。但是,我希望应用一种转换,例如在将时间戳发送到模板之前,将所有时间戳从UTC更改为EST。这样,模板以EST而不是UTC显示时间。如何编辑ListView传递到模板中的内容?

正如其他作者所说,模板标记最能解决您的特定用例(转换时间戳)

如果仍要修改数据,请查看djangos
MultipleObjectMixin
中使用的djangos
ListView

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时间戳都会转换成本地格式!所以,如果你激活了本地化和国际化,你不需要做任何事情。