2016-03-07 3 views
2

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

Я пытаюсь найти запрос, который бы разрешил это, но я не хочу использовать Django Paginator. Какие-либо предложения?

+3

Почему Paginator Джанго не подходит? – Alasdair

+0

Его подходящий, однако, пытаясь сделать это так долго, прежде чем обнаруживать paginator, я думаю, что любопытство стало лучше меня, и Im задается вопросом, возможно ли это даже с объектными менеджерами. – JBT

+1

Еще проще было бы использовать ['ListView'] (https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-display/#listview), тогда вы полностью видите код (включая разбивку на страницы) будет составлять около 5 строк (минимум) – Sayse

ответ

5

Вы можете разрезать запросы, чтобы ограничить количество результатов.

article = Article.objects.all()[:3] # first three articles 

article = Article.objects.all()[3:6] # second three articles 

На вашем сайте, вы хотите способ отслеживать, какие страницы вы на так что вы можете нарезать QuerySet правильно, и отображать ссылки на предыдущие и последующие страницы. Вы можете реализовать это самостоятельно, если хотите, но было бы проще использовать Django paginator, который сделает это за вас.

1

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

Из документации pagination, проверить этот пример:

Определите функцию вида:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from django.shortcuts import render 

def listing(request): 
    article_list = Articles.objects.all() 
    paginator = Paginator(article_list, 3) # Show 3 articles per page 

    page = request.GET.get('page') 
    try: 
     articles = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     articles = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     articles = paginator.page(paginator.num_pages) 

    return render(request, 'list.html', {'articles': articles}) 

И в HTML форму:

{% for article in articles %} 
    {# Each "article" is a Article model object. #} 
    {{ article.full_name|upper }}<br /> 
    ... 
{% endfor %} 

<div class="pagination"> 
    <span class="step-links"> 
     {% if articles.has_previous %} 
      <a href="?page={{ articles.previous_page_number }}">previous</a> 
     {% endif %} 

     <span class="current"> 
      Page {{ articles.number }} of {{ articles.paginator.num_pages }}. 
     </span> 

     {% if articles.has_next %} 
      <a href="?page={{ articles.next_page_number }}">next</a> 
     {% endif %} 
    </span> 
</div> 
Смежные вопросы