列表视图中的Django CBV排序不工作

列表视图中的Django CBV排序不工作,django,django-views,Django,Django Views,我不确定出了什么问题,但我无法订购CBV中生成的列表。我遵循了django文档中的说明。模型如下所示: class Event(models.Model): ... venue = models.ForeignKey( 'app_place.PointOfInterest', related_name='events', verbose_name=_('Event Place'), ) start = models.Date

我不确定出了什么问题,但我无法订购CBV中生成的列表。我遵循了django文档中的说明。模型如下所示:

class Event(models.Model):
...
    venue = models.ForeignKey(
        'app_place.PointOfInterest',
        related_name='events',
        verbose_name=_('Event Place'),
    )
    start = models.DateTimeField(
        default=timezone.now(),
        verbose_name=_('Start date'),
    )

    def sorted_events_set(self):
        return self.event_set.order_by('start')
并且views.py包含:

class PoiDetail(SingleObjectMixin, ListView):
...
    def get_queryset(self):
        return self.object.events.all()
一切都很好,但html页面中的列表是按ID排序的(顺便说一句,顺序颠倒了)。因此,我通过以下方式添加了订单_:

return self.object.events.all().order_by('start')
但它不起作用(顺序保持不变)。发生了什么事?这不是正确的方法吗?我还尝试在模型中添加其他问题中建议的特定顺序,但随后出现了不同的错误,我不知道如何使用
sorted\u events\u set
方法编写返回语句。 谢谢你的帮助

编辑

这是完整的views.py

class PoiDetail(SingleObjectMixin, ListView):
    template_name = 'app_place/poi.html'

    def get(self, request, *args, **kwargs):
        self.object = self.get_object(queryset=PointOfInterest.objects.all())
        return super(PoiDetail, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(PoiDetail, self).get_context_data(**kwargs)
        context['poi'] = self.object
        return context

    def get_queryset(self):
        return self.object.events.all().order_by('start')
这是模板:

{% for event in poi.events.all %}
    <a href="/e20/event/{{event.id}}" class="list-group-item">
    <h4 class="list-group-item-heading">{{ event.title }}</h4>
    <p class="list-group-item-text">{{event.description}}</p>
    </a>
{% endfor %}
{%for poi.events.all%中的事件]
{%endfor%}

首先,我不建议混合使用
SingleObjectMixin
ListView
。它们是为两个截然不同的目标编写的,并且在实现这些目标的方式上是不兼容的。你可以像以前那样修补它,但是如果你不太小心,你仍然可能会遇到很多意想不到的行为,特别是在依赖调用
super
时。实际上,您只是试图创建一个细节视图,所以您应该使用
兴趣点作为模型的子类
DetailView

现在解决排序问题:您不能将参数传递给模板中的函数,因此您必须在视图中的上下文中对queryset进行排序,或者创建一个没有任何(必需)参数的函数。我将使用第一种方法,在视图代码中保留视图的逻辑,并防止助手方法使模型混乱。无论哪种方式,您都必须准确跟踪您使用的查询集,因为对一个查询集进行排序不会影响另一个查询集

因此,使用上下文方法:

class POIDetail(DetailView):
    model = PointOfInterest

    def get_context_data(self, **kwargs):
        context = super(POIDetail, self).get_context_data(**kwargs)
        context['sorted_event_list'] = self.object.events.order_by('start')
        return context

在模板中,使用
{%forevent in sorted_event_list%}
进行迭代

你能在模板中发布你的完整视图和列表吗?也许你应该用模板中的
{%for event in poi.events.all%}
替换为
{%for event in page_obj%}
。你需要
self.object.event_set.order_by('start')
谢谢你的帮助,但这不是我需要的解决方案。第一个实现完全遵循django文档(因此我不理解您为什么说不建议这样做),事实上,我能够检索到与某个兴趣点相关的所有信息以及与该地点相关的事件(但无法对它们进行排序)。在您的实现中,事件列表是有序的,但是兴趣点上的信息不再可用。。。。我不知道文档提供了这个示例,但正如您的问题所示,将
SingleObjectMixin
MultipleObjectMixin
混合通常会增加复杂性,并在您想做更多事情时产生不必要的问题。您的模板上下文应该包含
兴趣点
对象作为
兴趣点
对象
,因此它肯定是可用的。您还可以将
context\u object\u name
重写为类属性,以提供您自己的上下文名称。宾果!!!那是丢失的一块
pointofinterest
是访问
pointofinterest
的正确方法。谢谢