简体   繁体   English

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

[英]Django1.4: How to use order_by in template?

Django1.4: How to use order_by in template? Django1.4:如何在模板中使用order_by?

models.py 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)

Above is my models.py. 以上是我的models.py。

I want to use 'order_by'( https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by) 我想使用'order_by'( https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by)

And... 和...

views.py 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'

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

And

customerDetail.html 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>

I want to use order_by in template... 我想在模板中使用order_by ...

What should I do? 我该怎么办?

看看dictsort过滤器,它几乎就是你想要的东西。

The order_by needs at least one argument, and Django does not allow you to pass arguments to a function or method inside a template. order_by至少需要一个参数,Django不允许您将参数传递给模板中的函数或方法。

Some alternatives are: 一些替代方案是:

  • Use Jinja2 template engine instead of Django's one (Jinja2 will let you pass arguments to methods and is said to perform better) 使用Jinja2模板引擎而不是Django的一个(Jinja2会让你传递方法的参数,据说表现更好)
  • order the dataset in the view 在视图中对数据集进行排序
  • use the " Meta:ordering " attribute to define a default ordering criteria for your models 使用“ Meta:ordering ”属性为您的模型定义默认排序条件
  • write a custom filter so you can queryset|order_by:'somefield' ( see this snippet ) 编写自定义过滤器,以便查询queryset|order_by:'somefield'请参阅此片段
  • as suggested by Michal , you can write a custom Manager with predefined methods for the orderings you need 正如Michal所建议的那样,您可以编写一个自定义管理器,其中包含您需要的预定义方法

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM