Следующие предыдущие ссылки из набора запросов / общие представления - PullRequest
14 голосов
/ 07 февраля 2010

У меня довольно простой набор запросов и связанные общие представления:

f_detail = {
         'queryset': Foto.objects.all(),
         'template_name': 'foto_dettaglio.html',
         "template_object_name" : "foto",
       }

urlpatterns = patterns('',
# This very include
(r'^foto/(?P<object_id>\d+)/$', list_detail.object_detail, f_detail, ),
)

Просто шаблон для генерации страницы с подробностями фотографии: так что нет просмотра.


Есть ли простой способ иметь ссылку на предыдущую | следующий элемент в шаблоне без ручного кодирования вида?

Что-то вроде:

{% if foto.next_item %} 
  <a href="/path/foto/{{ foto.next_item.id_field }}/">Next</a> 
{% endif}

Ответы [ 3 ]

24 голосов
/ 07 февраля 2010
class Foto(model):
  ...
  def get_next(self):
    next = Foto.objects.filter(id__gt=self.id)
    if next:
      return next.first()
    return False

  def get_prev(self):
    prev = Foto.objects.filter(id__lt=self.id).order_by('-id')
    if prev:
      return prev.first()
    return False

Вы можете настроить их по своему вкусу. я просто снова посмотрел на ваш вопрос ... чтобы сделать это проще, чем с помощью оператора if, вы можете заставить методы возвращать разметку для ссылки на следующий / предыдущий, если она есть, в противном случае ничего не возвращать. тогда вы просто сделаете foto.get_next и т. д. и помните, что наборы запросов ленивы, поэтому вы не получите тонны элементов в следующем / пред.

7 голосов
/ 27 декабря 2013

Вышеуказанная версия Foto имеет несколько недостатков:

  • Выполнение булевой оценки, такой как if next:, может быть медленным, поскольку в основном загружается весь результат QuerySet Используйте next.exists() или попробуйте / кроме как в моей версии.
  • Результат get_prev() неверен, потому что в этом случае вам нужно изменить порядок.

Итак, FWIW, вот моя версия для общего первичного ключа:

def get_next(self):
    """
    Get the next object by primary key order
    """
    next = self.__class__.objects.filter(pk__gt=self.pk)
    try:
        return next[0]
    except IndexError:
        return False

def get_prev(self):
    """
    Get the previous object by primary key order
    """
    prev = self.__class__.objects.filter(pk__lt=self.pk).order_by('-pk')
    try:
        return prev[0]
    except IndexError:
        return False
1 голос
/ 18 июля 2011

Если вы примете Model.objects.all () в качестве набора запросов и у вас все в порядке с захватом следующего / предыдущего элемента с помощью поля даты (обычно «созданное» поле с auto_now_add = True дает тот же порядок, что и ID объекта), вы можете использовать get_next_by_foo () и get_previous_by_foo () , где 'foo' - поле даты.

Для следующих / предыдущих ссылок из более сложного QuerySet использование Paginator с пороговым значением, равным единице , может показаться наилучшим вариантом.

...