如何扩展 Django 通用年份档案视图?

发布于 2024-12-13 07:26:18 字数 1585 浏览 2 评论 0原文

我使用 Django 的通用年份存档视图按年份显示事件对象。这可能是也可能不是最好的方法,因为我发现 Django 将对象列表限制为所经过的年份;我的日期范围跨越今年到下一年。

这是我的观点:

class VisitingScholarsYearView(YearArchiveView):

    allow_empty = True
    allow_future = True
    date_field = 'event_date'
    template_name = "events/dvs_test.html"
    context_object_name = 'event_list'
    make_object_list = True

    def get_queryset(self):
            return Event.school_year_events.from_year(self.get_year()).filter(event_type__title='Distinguished Visiting Scholars Series')

这是我的模型上的管理器(带有名为 event_date 的 DateField 的事件对象):

class SchoolYearManager(models.Manager):
    def live_events(self, start_date, end_date):
        return self.filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

    def this_year(self):
        now = datetime.datetime.now()
        current_year = now.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year + 1), 6, 30)
        return self.live_events(start_date, end_date)

def from_year(self, year):
        start_date = datetime.date(int(year), 7, 1)
        end_date = datetime.date((int(year) + 1), 6, 30)
        return self.live_events(start_date, end_date)

最后是我的视图 url:

url(r'^distinguished-visiting-scholars-series/(?P<year>\d{4})/$', VisitingScholarsYearView.as_view()),

当我点击 API 时,我得到了我期望的事件。但是 YearArchiveView 似乎将返回的事件限制为我给它的年份;这也是预期的,但我希望它能够跨越我在经理中提到的范围(即 7 月 1 日到 6 月 30 日)。

我怎样才能改变这种行为?或者我应该尝试不同的视图(ListView)?

I'm using Django's generic year archive view to display event objects by year. This may or may not be the best way to do this since I found that Django restricts the object list to the year being passed; my date range spans the current year into the next.

Here's my view:

class VisitingScholarsYearView(YearArchiveView):

    allow_empty = True
    allow_future = True
    date_field = 'event_date'
    template_name = "events/dvs_test.html"
    context_object_name = 'event_list'
    make_object_list = True

    def get_queryset(self):
            return Event.school_year_events.from_year(self.get_year()).filter(event_type__title='Distinguished Visiting Scholars Series')

Here's the manager on my model (an Event object with a DateField called event_date):

class SchoolYearManager(models.Manager):
    def live_events(self, start_date, end_date):
        return self.filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

    def this_year(self):
        now = datetime.datetime.now()
        current_year = now.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year + 1), 6, 30)
        return self.live_events(start_date, end_date)

def from_year(self, year):
        start_date = datetime.date(int(year), 7, 1)
        end_date = datetime.date((int(year) + 1), 6, 30)
        return self.live_events(start_date, end_date)

And finally, my url for the view:

url(r'^distinguished-visiting-scholars-series/(?P<year>\d{4})/

When I hit the API, I get the events I expect. But the YearArchiveView appears to limit the returned events to the year I give it; this is also expected, but I'd like it to span the range I refer to in the manager (ie July 1 to June 30 ).

How can I change this behavior? Or should I attempt a different view (ListView)?

, VisitingScholarsYearView.as_view()),

When I hit the API, I get the events I expect. But the YearArchiveView appears to limit the returned events to the year I give it; this is also expected, but I'd like it to span the range I refer to in the manager (ie July 1 to June 30 ).

How can I change this behavior? Or should I attempt a different view (ListView)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ヅ她的身影、若隐若现 2024-12-20 07:26:18

我认为您不应该使用 YearArchiveView 作为此处的基础 - 关于获取该日期的对象有太多内置逻辑。

相反,将 ListViewYearMixin 一起使用:

class VisitingScholarsYearView(YearMixin, ListView):

I don't think you should use YearArchiveView as the base here - there's too much built-in logic around getting the objects for that date.

Instead, use ListView with YearMixin:

class VisitingScholarsYearView(YearMixin, ListView):
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文