Замена для num_latest с основанными на классе обобщенными представлениями на основе даты? - PullRequest
0 голосов
/ 12 сентября 2011

Я переключился на Django 1.3, чтобы получить нумерацию страниц для моих общих представлений на основе даты.Это прекрасно работает, однако есть страница, где я хочу указать определенное количество элементов, но не хочу разбивать их на страницы.Например, верните первые 5 записей новостей.

В версии 1.2 у нас был num_latest, который мы могли бы вставить в наш информационный запрос для получения последних элементов.Похоже, этого не существует в новых базовых представлениях на основе классов.

Я мог бы установить paginate_by равным 5 и просто не использовать ссылки нумерации страниц в шаблоне, но тогда люди все равно смогут увидеть старыезаписи путем перфорирования в URL вручную (что я не хочу).Кроме того, я не хочу, чтобы Django установил нумерацию страниц, которую я не собираюсь использовать.

Редактировать: это строка urlconf, которую я сейчас использую:

url(r'^$', 
    ArchiveIndexView.as_view(
        model = Entry,
        context_object_name = 'entry_list',
        template_name = 'news/news.html',
        date_field = 'published',
    ), name = 'archive_index'
),

Дальнейшее редактирование: Попытка переопределить get_dated_queryset Я использовал этот бит кода в сочетании с urlconf, как указано выше, но с новым представлением под названием:

class MainIndex(ArchiveIndexView):
    def get_dated_queryset(self):
        return Entry.objects.all()[:2]

Я получаю почти ту же ошибку, что упоминалась в комментариях: Невозможно переупорядочитьзапрос после взятия фрагмента.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Попробуйте вместо этого переопределить: def get_dated_items(self): date_list, items, extra_context = super(MainIndex, self).get_dated_items() return (date_list, items[:2], extra_context) Примечание: эта реализация может оставить date_list несовместимым с набором запросов items после того, как последний будет разрезан.Я думаю, что для того, чтобы это исправить, тебе тоже нужно регенерировать date_list.см. реализацию BaseArchiveIndexView.get_dated_items в SVN для получения более подробной информации: http://code.djangoproject.com/browser/django/trunk/django/views/generic/dates.py. Что-то вроде этого может работать: def get_dated_items(self): date_list, items, extra_context = super(MainIndex, self).get_dated_items() items = items[:2] date_list = self.get_date_list(items, 'year') if not date_list: items = items.none() return (date_list, items, extra_context) , но если это работает без этого, я бы не трогал его, потому что это выглядит слишком грязно.

0 голосов
/ 27 июля 2013

Я сам столкнулся с этой проблемой. Я обнаружил, что использование ListView (вместо ArchiveIndexView) для этого сэкономило мне время и хлопоты.

Для вашего первого куска кода разница будет:

from django.views.generic import ListView


url(r'^$', 
    ListView.as_view(
        model = Entry,
        context_object_name = 'entry_list',
        template_name = 'news/news.html',
        queryset=Entry.objects.all().order_by("-published")[:2],
    ), name = 'archive_index'
),
...