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

2024-10-01 11:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django列表视图

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

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


Tags: djangoname视图模板列表model时间page
2条回答

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

如果仍要修改数据,请查看djangosMultipleObjectMixin中使用的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_queryset()方法并返回一个iterable,该iterable按照您希望的方式进行转换。使用这个钩子,您仍然可以使用泛型ListView的所有优点

谢谢大家的评论和回答。如果您对直接编辑查询集感兴趣,这本身可能很有用,请查看下面@Yves Hary的答案

对于我的用例,自定义模板标记(https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#writing-custom-template-filters)可以工作。如果您感兴趣,这是我的代码:

应用程序内/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" }}

相关问题 更多 >