Django:можно ли найти конкретный объект на странице?

Скажем, я хочу построить форум с реализациями Threadи Commentконцепцией.. CommentМодель ForeignKeyк Thread.

class Thread(models.Model):
    title = models.CharField(max_length=200)
    ....

class Comment(models.Model):
    thread = models.ForeignKey(Thread, ...)
    comment = models.TextField()
    ....
  1. Поток сведений имеет некоторые комментарии
  2. Комментарии в подробном потоке, используемом /?page={number}для разбиения на страницы.

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

Например, у меня один объект комментария с id=13найденным page=3.

нитка

Вот мой views.py

def thread_detail(request, topic_slug, pk):
    """
    detail thread public view.
    :param `topic_slug` is slug from the topic.
    :param `pk` is id from thread.
    """
    template_name = 'public/thread_detail.html'

    numb_pages = 10
    get_page = request.GET.get('page')
    thread = get_object_or_404(Thread, topic__slug=topic_slug, pk=pk)
    comments = Comment.objects.filter(thread=thread).order_by('created')
    ....

    page_obj = PaginatorFBV(comments, numb_pages, get_page).queryset_paginated()
    page_range = PaginatorFBV(comments, numb_pages, get_page).page_numbering()
    comments = page_obj.object_list

    context = {
        'thread': thread,
        'comments': comments,
        'page_obj': page_obj,
        'page_range': page_range
    }
    return render(request, template_name, context)

Я хочу создать его с динамически, например в моем find_comment_view.py:

def find_comment(request, pk):
    """
    Return redirect to the comment on thread, with current page.
    :param `pk` is pk/id from comment.
    """
    comment = get_object_or_404(Comment, pk=pk)
    comments = Comment.objects.filter(thread__in=comment.thread)

    # what i should be do here?

Большое спасибо..

ОБНОВЛЕНИЕ:

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

def find_comment(request, pk):
    """
    Return redirect to the comment on thread, with current page.
    :param `pk` is pk/id from comment.
    """
    comment = get_object_or_404(Comment, pk=pk)
    comments = Comment.objects.filter(thread=comment.thread).order_by('created')
    thread = get_object_or_404(Thread, pk=comment.thread.pk)

    # Initial `page_obj` to get max numb of pagination.
    items_per_page = 10 # this is same with what we do for `numb_pages = 10` inside `def thread_detail(...)`
    initial_page_obj = PaginatorFBV(comments, items_per_page, 1).queryset_paginated()
    max_numb_pages = initial_page_obj.paginator.num_pages

    for page in range(max_numb_pages):
        page += 1
        page_obj = PaginatorFBV(comments, items_per_page, page).queryset_paginated()
        comment_objects = page_obj.object_list

        # Check the output of `comment_objects`
        # >>> print(comment_objects, page)
        # <QuerySet [<Comment: regina>]> 1
        # <QuerySet [<Comment: beverly>]> 2
        # <QuerySet [<Comment: amy>]> 3
        # <QuerySet [<Comment: hannah>]> 4

        for obj in comment_objects:
            if obj.pk == comment.pk:
                # eg: /thread/20/?page=2#comment-30
                return redirect(
                    ('%s?page=%s#comment-%s') % (
                        thread.get_absolute_url(),
                        page, comment.pk
                    )
                )
    return redirect(('%s#comment-%s') % (thread.get_absolute_url(), comment.pk))

и внутри urls.py

urlpatterns = [
    ....
    url(
        r'^comment/direct/(?P<pk>[-d]+)/$',
        find_comment, name='find_comment_page'
    ),
]

1 ответ

  1. Вы можете получить положение объекта через

    position=Comment.objects.filter(created__lt=comment.created).order_by('created').count()
    

    Затем получить номер страницы через

    items_per_page=10
    page = int(position/items_per_page)