2013-02-13 61 views
3

Django1.4:如何在模板中使用order_by?Django1.4:如何在模板中使用order_by?

models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class Note(models.Model): 
    contents = models.TextField() 
    writer = models.ForeignKey(User, to_field='username') 
    date = models.DateTimeField(auto_now_add=True) 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 


class Customer(models.Model): 
    name = models.CharField(max_length=50,) 
    notes = generic.GenericRelation(Note, null=True) 

以上就是我的models.py。

我想用 'ORDER_BY'(https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by)

而且......

views.py

from django.views.generic import DetailView 
from crm.models import * 

class customerDetailView(DetailView): 
    context_object_name = 'customerDetail' 
    template_name = "customerDetail.html" 
    allow_empty = True 
    model = Customer 
    slug_field = 'name' 

我views.py使用的DetailView(https://docs.djangoproject.com/en/1.4/ref/class-based-views/#detailview)。

而且

customerDetail.html

<table class="table table-bordered" style="width: 100%;"> 
    <tr> 
     <td>Note</td> 
    </tr> 
    {% for i in customerDetail.notes.all.order_by %}<!-- It's not working --> 
     <tr> 
      <th>({{ i.date }}) {{ i.contents }}[{{ i.writer }}]</th> 
     </tr> 
    {% endfor %} 
</table> 

我想在模板中使用ORDER_BY ...

我應該怎麼辦?

+1

你有沒有在'customerDetailView'中試過'queryset = Customer.objects.order_by()'? – rxdazn 2013-02-13 14:47:53

+0

是的,我試過'queryset = Customer.objects.order_by('note__date')'和'queryset = Customer.objects.order_by('note__date')'。但失敗... – chobo 2013-02-13 15:02:58

回答

4

order_by至少需要一個參數,並且Django不允許您將參數傳遞給模板中的函數或方法。

一些替代方案:

  • 使用Jinja2模板引擎,而不是Django的一個(使用Jinja2會讓你將參數傳遞給方法,據說效果更好)視圖
  • 順序數據集
  • 使用「Meta:ordering」屬性爲您的模型定義默認排序標準
  • 編寫自定義過濾器,以便您可以queryset|order_by:'somefield'see this snippet
  • 通過Michal的建議,你可以用寫爲序預定義的方法custom Manager你需要
+0

...或使用自定義管理器的類,它將爲您提供預定義的方式訂購 – 2013-02-13 14:53:41

+0

我不知道第四個技巧「編寫自定義過濾器,以便您可以queryset | order_by:'somefield'' 」。你能給我...一些示例代碼? – chobo 2013-02-13 15:04:47

+1

無論如何,我解決了它。 'class Meta: \t \t ordering = ['date']''(在models.py中) – chobo 2013-02-13 15:06:14

7

退房的dictsort過濾器,這幾乎是你在找什麼,我認爲。

+0

不適用於查詢集 – Catskul 2015-04-03 14:46:50

+2

這是最簡單的答案,它對查詢集起作用。 – 2015-11-23 14:45:28