Форум сайта python.su
Приветствую.
В общем, не могу прикрутить дефолтный джанговский пагинатор.
Точнее сказать, я его прикрутил, но видимо не так как надо, потому что на главной страничке написано только “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})
{% 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 %}
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
{% 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)
Офлайн
Не понял смысла юмора, раз уж Вы используете 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)
Офлайн
Спасибо за помощь, я не знал этого, т.к. полный новичок в Django.
Отредактировано Galvanize (Июнь 1, 2013 17:15:48)
Офлайн
А ежели требуется осуществить переход между страницами? То есть передаётся один объект, а не список.
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)
Офлайн
Передай в контекст айдишники предыдущего/следующего поста. Это проблема гигантская что ли?
Офлайн
Это проблема гигантская что ли?Для меня пока да
Офлайн
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
Офлайн
Спасибо за детальный код. Буду разбираться на досуге, пока выдаёт исключение TypeError:
get_context_data() got an unexpected keyword argument 'object'
Офлайн
В профиле аська, если что пиши туда
Офлайн