2012-09-02 136 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中(我不喜欢这个,说实话)