Разбиение на страницы основанных на дате универсальных представлений в Django

Это пример кода из одного из моих проектов, где я измеряю текстовое представление. Вы бы измерили TableRow

 TextView filter = findViewById(R.id.list_filter);
           filter.measure(0, 0);

           int center = filter.getLeft() + filter.getMeasuredWidth()/2;

            Point p =  new  ViewTarget(filter).getPoint();




                    Log.i(TAG, "x: " + p.x
                    + " width: " + filter.getWidth()
                    + " right: " + filter.getRight()
                    + " left: " + filter.getLeft()
                    + " measured: " + filter.getMeasuredWidth()
            );

            Log.i(TAG,  "value: " + (0- filter.getLeft() - filter.getMeasuredWidth()));
5
задан Hank Gay 21 March 2009 в 20:25
поделиться

5 ответов

Дата базировалась, универсальные представления не имеют разбиения на страницы. Кажется, что Вы не можете добавить разбиение на страницы через обертывание их также, так как они возвращают представленный результат.

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

Так как Вашим вопросом является допустимый и рассмотрение кода; интересно, почему они не отделяли queryset поколение как отдельные функции. Вы могли просто использовать их и представить, как Вы желаете затем.

2
ответ дан 14 December 2019 в 09:01
поделиться

Я вчера работал над проблемой, похожей на эту, и я нашел лучшее решение для себя лично - использовать общее представление object_list для всех страниц на основе даты, но передать отфильтрованный набор запросов, следующим образом:

import datetime, time

def post_archive_month(request, year, month, page=0, template_name='post_archive_month.html', **kwargs):
    # Convert date to numeric format
    date = datetime.date(*time.strptime('%s-%s' % (year, month), '%Y-%b')[:3])
    return list_detail.object_list(
      request,
      queryset = Post.objects.filter(publish__year=date.year, publish__date.month).order_by('-publish',),
      paginate_by = 5,
      page = page,
      template_name = template_name,
      **kwargs)

Где urls.py читается примерно так:

url(r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/$',
    view=path.to.generic_view,
    name='archive_month'),

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

1
ответ дан 14 December 2019 в 09:01
поделиться

Я создал тег шаблона для разбивки на страницы на основе шаблонов коллекций, переданных в шаблоны, которые еще не разбиты на страницы. Скопируйте следующий код в файл app / templatetags / pagify.py .

from django.template import Library, Node, Variable
from django.core.paginator import Paginator
import settings

register = Library()

class PagifyNode(Node):
    def __init__(self, items, page_size, varname):
        self.items = Variable(items)
        self.page_size = int(page_size)
        self.varname = varname

    def render(self, context):
        pages = Paginator(self.items.resolve(context), self.page_size)
        request = context['request']
        page_num = int(request.GET.get('page', 1))

        context[self.varname] = pages.page(page_num)
        return ''

@register.tag
def pagify(parser, token):
    """
    Usage:

    {% pagify items by page_size as varname %}
    """

    bits = token.contents.split()
    if len(bits) != 6:
        raise TemplateSyntaxError, 'pagify tag takes exactly 5 arguments'
    if bits[2] != 'by':
        raise TemplateSyntaxError, 'second argument to pagify tag must be "by"'
    if bits[4] != 'as':
        raise TemplateSyntaxError, 'fourth argument to pagify tag must be "as"'
    return PagifyNode(bits[1], bits[3], bits[5])

Чтобы использовать его в шаблонах (предположим, мы передали список без разбивки на страницы с именем items ):

{% load pagify %}

{% pagify items by 20 as page %}
{% for item in page %}
    {{ item }}
{% endfor %}

Аргумент page_size (20) также может быть переменной. Тег автоматически обнаруживает page = 5 переменных в строке запроса. И если вам когда-нибудь понадобится перейти к пагинатору, принадлежащему странице (например, для подсчета страниц), вы можете просто позвонить:

{{ page.paginator.num_pages }}
3
ответ дан 14 December 2019 в 09:01
поделиться

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

0
ответ дан 14 December 2019 в 09:01
поделиться

Существует также отличное дополнение django-pagination , которое полностью не зависит от основного представления.

1
ответ дан 14 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: