Пагинация в подробном представлении - PullRequest
0 голосов
/ 17 февраля 2019

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

##view :
class PostDetailView(DetailView):
    model = Post
    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        context['comments'] = Comment.objects.filter(post_id=self.object.id).all()
        context['comments_number'] = Comment.objects.filter(post_id=self.object.id).count()
        context['form'] = CommentForm()
        return context


    def post(self, request, pk):
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = Post.objects.get(id=pk)
            comment.user = request.user
            comment.save()
            post = Post.objects.get(pk=pk)
            post.comments_nmb+=1
            post.save()
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))


##template:
{% extends "blog/base.html" %}
{% block content %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ object.author.profile.image.url }}">
<div class="media-body">
  <div class="article-metadata">
    <a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>
    <small class="text-muted">{{ object.date_posted|date:"F d, Y" }}</small>
    {% if object.author == user %}
      <div>
        <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'post-update' object.id %}">Update</a>
        <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'post-delete' object.id %}">Delete</a>
      </div>
    {% endif %}
  </div>
  <h2 class="article-title">{{ object.title }}</h2>
  <p class="article-content">{{ object.content }}</p>
  <p>{{comments_number}} Comments</p>
 {%  for comment in comments %}
 <div class="media">                            
                        <a class="float-left">
                          <img class="rounded-circle account-img" src="{{ comment.user.profile.image.url }}">
                        </a>
                        <div class="media-body">

                          <h4 class="media-heading ">{{ comment.user.username }}</h4>
                          {{comment.text}}
                        </div>
                        <p class="float-right"><small>{{ comment.date}}</small></p>
                      </div>
{% endfor %}
</div>
</article>
{% endblock content %}

Как сделать разбиение на страницы для комментариев в цикле for?

1 Ответ

0 голосов
/ 17 февраля 2019

Почти точно так же:

from django.core.paginator import <b>Paginator</b>

class PostDetailView(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super(PostDetailView, self).get_context_data(**kwargs)
        page = <b>self.request.GET.get('page')</b>
        comments = <b>Paginator(self.object.comment_set.all(), 25)</b>
        context['comments'] = comments.<b>get_page(page)</b>
        context['comments_number'] = self.object.comment_set.count()
        context['form'] = CommentForm()
        return context

    # ...

Таким образом, мы получаем параметр page из параметров self.request.GET, а затем создаем Paginator и соответствующим образом отображаем его на странице.Вам, вероятно, следует также упорядочить комментарии в соответствии с некоторым полем.Прямо сейчас комментарии могут появляться в любом порядке, и, таким образом, следующая страница может содержать комментарии, которые появились на предыдущей странице и т. Д.

Переменная comments, таким образом, является объектом разбиения на страницы, и вы можете отобразить его следующим образом:вы работаете в представлении на основе функций.

Обратите внимание, что вы можете использовать comment_set (или если вы установите другое related_name, это имя) для доступа к набору атрибутов, связанных с объектом Post.

При этом, возможно, это больше ListView над комментариями или FormView, поскольку вы включаете Form для комментариев.

...