Тег «Последний» не работает - PullRequest
       14

Тег «Последний» не работает

3 голосов
/ 10 сентября 2010

У меня есть набор запросов «рекламных» событий, которые отображаются в шаблоне. Каждая из этих акций также имеет 1 или более назначений. Что я хочу сделать, это отобразить даты первого и последнего назначения.

Пока что использование «первого» тега работает. Однако использование тега «last» вызывает:

Значение исключения TemplateSyntaxError: Оказалось исключение при рендеринге: Отрицательное индексирование не поддерживается.

Вот шаблон скрипта

{% for promotion in promotions%}
    {% with promotion.appointment_set.all as appointments %}
        {% with appointments|first as first_ap %}
            {{ first_ap.date|date }}
        {% endwith %}

        {% with appointments|last as last_ap %}
            {{ last_ap.date|date }}
        {% endwith %}
    {% endwith %}
{% endfor %}

Что я здесь не так делаю?

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Преобразование набора запросов в список перед передачей его в шаблон также приводит к тому, что вы хотите перейти:

return render_to_response(template, { 
     appointments: list(Appointments.objects.all()) 
})

Поскольку я использую весь список, я делаю что-то вроде этого (что можетоткрыто для улучшения):

{% for ap in appointments %}
  {% ifequal ap appointments|last %}
    ap.date
  {% endifequal %}
{% endfor %}

Атрибуты объекта все еще работают.Например: ap.user.full_name

3 голосов
/ 10 сентября 2010

Причина вашей проблемы в том, на что @Daniel указал : Querysets не поддерживают отрицательную индексацию.Его решение стоит изучить.

Другой способ решения этой проблемы - добавить пользовательский фильтр, который будет работать со списками и наборами запросов.Что-то вроде:

@register.filter
def custom_last(value):
    last = None

    try:
        last = value[-1]
    except AssertionError:
        try:
            last = value.reverse()[0]
        except IndexError:
            pass

    return last

И в шаблоне:

{% with appointments|custom_last as last_ap %}
3 голосов
/ 10 сентября 2010

Тег last работает, разрезая список, чтобы получить последний элемент, используя формат отрицательного индекса: collection[-1].Но, как указывается в сообщении об ошибке, для наборов запросов отрицательная индексация не поддерживается.

Вероятно, самый простой способ решить эту проблему - создать новый метод в вашей модели Promotion, который будет возвращать последнее назначение:

class Promotion(models.Model):
    ... fields, etc ...

    def get_last_appointment(self):
        try:
            return self.appointment_set.all().order_by('-date')[0]
        except IndexError:
            pass

и позвоните по шаблону:

{{ promotion.get_last_appointment.date|date }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...