2017-03-09 69 views
2

我在我的基於類的視圖中使用ListView,我想知道是否有方法通過對模板進行排序來顯示模板對象集。這是我到目前爲止有:有沒有Django列表查看模型排序?

我的觀點:

class Reviews(ListView): 
    model = ProductReview 
    paginate_by = 50 
    template_name = 'review_system/reviews.html' 

ProductReviewdate_created域的模型。我想按降序對日期進行排序。我怎樣才能做到這一點?

回答

9

設置視圖的ordering屬性。

class Reviews(ListView): 
    model = ProductReview 
    paginate_by = 50 
    template_name = 'review_system/reviews.html' 

    ordering = ['-date_created'] 

如果您需要動態更改排序,則可以使用get_ordering代替。

class Reviews(ListView): 
    ... 
    def get_ordering(self): 
     ordering = self.GET.get('ordering', '-date_created') 
     # validate ordering here 
     return ordering 

如果您總是對固定日期字段進行排序,您可能會對ArchiveIndexView感興趣。

from django.views.generic.dates import ArchiveIndexView 

class Reviews(ArchiveIndexView): 
    model = ProductReview 
    paginate_by = 50 
    template_name = 'review_system/reviews.html' 
    date_field = "date_created" 

注意ArchiveIndexView不會在將來的日期顯示的對象,除非你設置allow_futureTrue

+0

我喜歡ArchiveIndexView,它的伎倆,但模板具有允許通過點擊標題排序列的表。當我這樣做時,這不起作用,你知道我該如何使它在那裏工作? – DeA

+0

如果您按其他字段進行排序,則聽起來像歸檔索引視圖不合適。 – Alasdair

0

你爲什麼不重寫get_queryset方法是這樣的:

class Reviews(ListView): 
    model = ProductReview 
    paginate_by = 50 
    template_name = 'review_system/reviews.html' 

    def get_queryset(self): 
     return YourModel.objects.order_by('model_field_here') 
+0

我會嘗試這個,但你的方法缺少一個def – DeA

+0

這沒有任何錯誤渲染或執行,但order_by沒有工作。 – DeA

+1

@DeA覆蓋'get_queryset'和使用'order_by'應該可以工作,但使用ListView你可能更喜歡重寫'ordered'或'get_ordering'。 – Alasdair