Django1.4: Как использовать order_by в шаблоне?

Django1.4: Как использовать order_by в шаблоне?

модели.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)

Выше мои модели.py.

Я хочу использовать 'order_by'(https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

А также...

просмотры.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 в шаблоне...

Что я должен делать?


person chobo    schedule 13.02.2013    source источник
comment
вы пробовали queryset = Customer.objects.order_by() в customerDetailView?   -  person rxdazn    schedule 13.02.2013
comment
Да, я пробовал queryset = Customer.objects.order_by('note__date') и queryset = Customer.objects.order_by('note__date'). Но не удалось...   -  person chobo    schedule 13.02.2013


Ответы (2)


Для order_by требуется хотя бы один аргумент, а Django не позволяет передавать аргументы функции или методу внутри шаблона.

Некоторые альтернативы:

  • Используйте механизм шаблонов Jinja2 вместо механизма Django (Jinja2 позволит вам передавать аргументы в методы и, как говорят, выступай лучше)
  • упорядочить набор данных в представлении
  • используйте атрибут "Meta:ordering", чтобы определить критерии заказа по умолчанию для ваших моделей
  • напишите собственный фильтр, чтобы вы могли queryset|order_by:'somefield' (см. этот фрагмент)
  • как предложил Michal, вы можете написать индивидуальный менеджер с предопределенными методами для необходимых вам заказов
person Paulo Scardine    schedule 13.02.2013
comment
...или используйте пользовательский менеджер для класса, который предоставит вам предопределенные способы заказа - person Michal Čihař; 13.02.2013
comment
Я не знаю, понимаю четвертый совет, напишите собственный фильтр, чтобы вы могли queryset|order_by:'somefield'. Не могли бы вы дать мне... пример кода? - person chobo; 13.02.2013
comment
Во всяком случае, я решил это. class Meta: ordering = ['date'] (в models.py) - person chobo; 13.02.2013
comment
ответ Кэти имеет такой пример кода, кажется, что она использует тот же фрагмент (но она забыла атрибутировать решение первоначальному автору). Кроме того, вам необходимо поместить этот файл в некоторое конкретное место чтобы иметь возможность загрузить его внутри шаблона. - person Paulo Scardine; 13.02.2013

Посмотрите фильтр dictsort, он довольно многое, что вы ищете, я думаю.

person msc    schedule 13.02.2013
comment
Это самый простой ответ, и он работает с наборами запросов. - person Corentin S.; 23.11.2015