Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2013 15:11:35

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Приветствую.
В общем, не могу прикрутить дефолтный джанговский пагинатор.
Точнее сказать, я его прикрутил, но видимо не так как надо, потому что на главной страничке написано только “Page of .” И все. Помогите, пожалуйста, прикрутить его нормально.
Делал все по документации, и вот что имеется:

views.py

from blog.models import Post
from django.views.generic import ListView, DetailView
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render_to_response
class PostListView(ListView):
    model = Post
class PostDetailView(DetailView):
    model = Post
def listing(request):
    post_list = Post.objects.all()
    paginator = Paginator(post_list, 1)
    page = request.GET.get('page')
    try:
        pages = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        pages = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        pages = paginator.page(paginator.num_pages)
    return render_to_response('blog/post_list.html', {"pages": pages})

blog/post_list.html
{% block content %}
    {% for post in pages %}
        <h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
        {{ post.full_name|upper }}<br />
    {% endfor %}
<div class="pagination">
    <span class="step-links">
        {% if pages.has_previous %}
            <a href="?page={{ pages.previous_page_number }}">previous</a>
        {% endif %}
        <span class="current">
            Page {{ pages.number }} of {{ pages.paginator.num_pages }}.
        </span>
        {% if pages.has_next %}
            <a href="?page={{ pages.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>
{% endblock %}

Без пагинации все работает как надо, и имеет такой вид:
views.py
from blog.models import Post
from django.views.generic import ListView, DetailView
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
class PostListView(ListView):
    model = Post
class PostDetailView(DetailView):
    model = Post

blog/post_list.html
{% block content %}
    {% for post in object_list %}
        <h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
        <p>Published: {{ post.datetime }}</p>
        <p>{{ post.content }}</p>
        <hr>
    {% endfor %}
{% endblock %}



Отредактировано Galvanize (Июнь 1, 2013 15:14:07)

Офлайн

#2 Июнь 1, 2013 16:22:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Не понял смысла юмора, раз уж Вы используете CBV, то зачем “прикручивать дефолтный пагинатор”, если он туда уже прикручен

class PostListView(ListView):
    model = Post
    paginate_by=10

{% if is_paginated %}
        <div class="pagination">
            <span class="page-links">
                {% if page_obj.has_previous %}
                    <a href="/posts?page={{ page_obj.previous_page_number }}">previous</a>
                {% endif %}
                <span class="page-current">
                    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                </span>
                {% if page_obj.has_next %}
                    <a href="/posts?page={{ page_obj.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>
    {% endif %}



Отредактировано FishHook (Июнь 1, 2013 16:25:48)

Офлайн

#3 Июнь 1, 2013 16:50:46

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Спасибо за помощь, я не знал этого, т.к. полный новичок в Django.



Отредактировано Galvanize (Июнь 1, 2013 17:15:48)

Офлайн

#4 Июнь 21, 2013 07:30:50

Liberty
Зарегистрирован: 2012-10-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

А ежели требуется осуществить переход между страницами? То есть передаётся один объект, а не список.

class PostDetai(DetailView):
	model = Post
	template_name = 'single.html'
	context_object_name = 'post'
	def get_object(self):
		return get_object_or_404(Post, slug__iexact = self.kwargs['slug'])

Нужно организовать переход на предыдущий/следующий пост.

Отредактировано Liberty (Июнь 21, 2013 07:31:14)

Офлайн

#5 Июнь 21, 2013 08:52:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Передай в контекст айдишники предыдущего/следующего поста. Это проблема гигантская что ли?



Офлайн

#6 Июнь 21, 2013 09:57:41

Liberty
Зарегистрирован: 2012-10-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Это проблема гигантская что ли?
Для меня пока да

Офлайн

#7 Июнь 21, 2013 10:30:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

class PostDetai(DetailView):
    model = Post
    template_name = 'single.html'
    context_object_name = 'post'
    def get_next(self):
        next = self.model.objects.filter(id__gt=self.object.id)
        if next.exists():
            return next[0]
        return False
    def get_prev(self):
        prev = self.model.objects.filter(id__lt=self.object.id)
        if prev.exists():
            return prev[0]
        return False
    def get_context_data(self, **kwargs):
        context=super(PostDetai, self).get_context_data(**kwargs)
        context['next']=self.get_next()
        context['prev']=self.get_prev()
        return context



Офлайн

#8 Июнь 21, 2013 20:38:23

Liberty
Зарегистрирован: 2012-10-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

Спасибо за детальный код. Буду разбираться на досуге, пока выдаёт исключение TypeError:

get_context_data() got an unexpected keyword argument 'object'

Офлайн

#9 Июнь 21, 2013 20:43:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Пагинация - помогите разобраться.

В профиле аська, если что пиши туда



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version