2012-09-02 169 views
4

讓這些機型:排序對象

class Category(models.Model): 
    name = models.CharField(max_length=20) 

class Word(models.Model): 
    name = models.CharField(max_length=200) 
    votes = models.IntegerField(default=1) 
    categories = models.ManyToManyField(Category, null=True, blank=True) 

這樣的觀點:

def main_page(request): 
    words = Word.objects.all() 
    categories = Category.objects.all() 
    return render(request, "main_page.html", {'words': words}) 

與此模板:

{% for category in categories %} 
    {% for word in category.word_set.all %} 
    <p>{{ word }}</p> 
    {% endfor %} 
{% endfor %} 

我想通過數模板排序的話票數和出版日期分開。我怎樣才能做到這一點?

+0

在你的模板中,你從哪裏得到'category'?無法在您的視圖中看到它。 – Jingo

+0

@Jingo,我的代碼不完整。我用'category'更新了視圖和模板。 – msampaio

+0

爲什麼不使用jquery sortable。這樣的事情可以而且應該由js來處理,而不是模板化。這將不必要地減慢你的響應時間。 –

回答

11

您可以custom template tag or filter,這讓設置和排序類型作爲參數的話去做。

例如(沒有測試):

custom_tags.py:

from django import template 
register = template.Library() 

@register.filter 
def sort_by(queryset, order): 
    return queryset.order_by(order) 

template.html

{% load custom_tags %} 
... 
{% for word in category.word_set.all|sort_by:'-votes' %} 
    <p>{{ word }}</p> 
{% endfor %} 
... 
+0

我測試過了。你的解決方案有效謝謝:-) – msampaio

+0

@MarcosdaSilvaSampaio太好了!歡迎 –

+0

當試圖強制django-taggit標籤以字母順序顯示時,這非常有用。 – user2916527

4

您可以在視圖

words = Word.objects.all().order_by('votes', 'pub_date') 
+0

我更新了我的問題。如果我使用「{%用於文字%}」,則您的解決方案有效。但是不要使用'{category.word_set.all%}中的字'。 – msampaio

+4

這種事情當然是主觀的,但恕我直言,最好在Rakesh建議的意見中管理這些事情。 Django故意限制了您可以放入模板的邏輯數量,這正是爲了鼓勵保持適當的MVT分離。如果你真的想在模板中做到這一點,自定義模板標籤和過濾器是要走的路(見goliney的答案)。 – niconoe

0

你還可以:

  1. 在分類模型添加特殊的方法,
  2. 定製產品經理Word中添加簡單快捷的方法,
  3. 使這個排序默認的Word中(我不喜歡這個,說實話)