Разбиение подробного представления в Django - PullRequest
1 голос
/ 28 июня 2011

Я новичок в Django и для своего первого проекта я создаю портфолио. И мне нужно немного начать с нумерации. У меня есть индексное представление со списком проектов и подробным представлением каждого проекта. В подробном представлении я хочу, чтобы функция была в состоянии разбивать на страницы между каждым отдельным объектом. Я просмотрел документацию по Pagination и применил то, что узнал, с моим индексным представлением, но когда я пытаюсь сделать то же самое с моим подробным представлением, я получаю TypeError, говорящую, что мой "объект типа 'Project' имеет нет лен ().

Вот пример моего кода views.py для справки:

def index( request ):
    all_projects = Project.objects.all().order_by( '-pub_date' )
    paginator = Paginator( all_projects, 12 )

    try:
        page = int( request.GET.get( 'page','1' ))
    except ValueError:
        page = 1

    try:
        projects = paginator.page( page )
    except (EmptyPage,InvalidPage):
        projects = paginator.page( paginator.num_pages )

    return render_to_response( 'portfolio/index.html', { 'all_projects':all_projects, 'projects':projects, 'MEDIA_URL':MEDIA_URL })

def detail( request, project_id ):
    project = get_object_or_404( Project, id=project_id )            
    return render_to_response( 'portfolio/detail.html', { 'project':project, 'MEDIA_URL':MEDIA_URL  } )

Прошу прощения, если я озвучиваю n00b-ish, потому что я есть, и заранее благодарен за любую помощь. Кроме того, я прочитал предыдущий пост , но, похоже, он ко мне не относится, потому что мои взгляды не основаны на классах.

Ответы [ 4 ]

5 голосов
/ 28 июня 2011

Django имеет встроенные get_next_by_FOO () / get_previous_by_FOO () методы, которые будут возвращать следующий / предыдущий объект, выселяющийся в поле datetime.

Вы можете получить к ним доступ вшаблон как-то вроде:

<a href="{{ project.get_next_by_pub_date.get_absolute_url }}">{{ project.get_next_by_pub_date.title }}</a>

Я бы сказал, что это предпочтительный метод по сравнению с использованием нумерации страниц, поскольку вы получите хороший URL-адрес, который можно определить в get_absolute_url вашей модели для каждого элемента!

Для разбивки на страницы вам нужен экземпляр QuerySet, а не объект!Таким образом, вы должны заменить свой get_object_or_404 вызов на filter / all.Таким образом, это будет в основном то же самое, что и представление списка, но просто передайте номер 1 на страницу, как вы уже делаете!

0 голосов
/ 15 июля 2015

В моем views.py

def ProjectDetail(request,pk):
    context = {}
    template = 'views/projectdetail.html'
    project = ''
    prev = Project.objects.filter(pk__lt=pk).order_by('-pk')[:1]
    next = Project.objects.filter(pk__gt=pk).order_by('pk')[:1]
    try:
     print(prev[0].pk)
     print(next[0].pk)
    except:
      pass
    project = Project.objects.filter(pk=pk)
   context['categories'] = ProjectCategory.objects.all()
   paginator = Paginator(project, 1) # Show 25 contacts per page
   page = request.GET.get('page')
   try:
      data = paginator.page(page)
   except PageNotAnInteger:
        # If page is not an integer, deliver first page.
       data = paginator.page(1)
   except EmptyPage:
      # If page is out of range (e.g. 9999), deliver last page of results.
      data = paginator.page(paginator.num_pages)
   if prev:
     context['prev'] = prev[0].pk
   if next:
      context['next'] = next[0].pk
   context['data'] = data
   return render_to_response(template, context,context_instance=RequestContext(request))

в моем шаблоне у меня есть

  <div class="row">
  <a {% if next %} href="{% url 'task:project-detail' next %}"      class="btn btn-primary pull-right" {% else %} class="btn btn-primary pull-right disabled" {% endif %}>Next</a>
  <a {% if prev %} href="{% url 'task:project-detail' prev %}" class="btn  btn-primary pull-left" {% else %} class="btn btn-primary pull-left disabled" {% endif %} >Previous</a>

</div>
0 голосов
/ 31 июля 2011

У меня фактически нет этой настройки через нумерацию страниц Django.Я использовал этот код:

prev_issue = Issue.objects.filter(title=title).filter(number__lt=issue.number).order_by('-number')[:1]
next_issue = Issue.objects.filter(title=title).filter(number__gt=issue.number).order_by('number')[:1]

В вашем случае я бы сделал что-то подобное, но вам бы тоже пришлось что-то сделать filter:

prev_project = Project.objects.order_by('-pub_date')[:1]
next_project = Project.objects.order_by('pub_date')[:1]

Затем поместитедва в контексте.

Я также рекомендую джанго-нумерацию страниц.Я заметил, что вы, вероятно, хотите, чтобы нумерация страниц оставалась в индексе, правильно?http://code.google.com/p/django-pagination/

Вам просто нужно возиться с кодами шаблонов, и это прекрасно работает.

0 голосов
/ 28 июня 2011

Самое замечательное в Django состоит в том, что есть код для почти каждой распространенной проблемы программирования, который вы можете загрузить и использовать в своем собственном проекте.(и большинство пакетов django тоже хорошо написаны)

для проверки пагинации http://pypi.python.org/pypi/django-pagination

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

надеюсь, это поможет, Антон

...