У меня есть форум Django app, его структура: «форум -> подфорум -> тема -> комментарии». Комментарии отображаются на странице соответствующей темы, поэтому представление темы обрабатывает тему вместе с ее комментариями. Сама тема включает в себя тему и первоначальный комментарий.
Я просмотрел несколько руководств и вопросов здесь, в SOF, поэтому каким-то образом я добился работы с нумерацией страниц в том смысле, что это сокращает количество отображаемых комментариев по числу в параметре Paginator (в примере 5). Но, к сожалению, я не могу воспроизвести ни ссылок, ни номеров страниц для навигации по пагинации. И я даже не знаю, где спрятана причина этой проблемы - то ли в html-коде, то ли в коде представления.
Помогите пожалуйста.
Просмотр:
class ShowTopic(DetailView):
model = Topic
template_name = "forum/topic.html"
slug_url_kwarg = 'topic_slug'
context_object_name = 'topic'
def get_context_data(self, **kwargs):
topic = get_object_or_404(Topic, slug=self.kwargs['topic_slug'])
comments = self.get_comments(topic)
comments_number = len(Comment.objects.filter(topic__id=topic.id))
context = {'menu': menu,
'topic': topic,
#'comments': comments,
'page_obj': comments,
'comm_num': comments_number}
return context
def get_comments(self, topic):
qs = Comment.objects.filter(topic=topic)
paginator = Paginator(qs, 5)
page = self.request.GET.get('page')
comments = paginator.get_page(page)
return comments
topic.html (шаблон темы и комментариев к ней)
{% extends 'base.html' %}
{% load static %}
{% block content %}
{{ topic.subject }}
Created by: {{ topic.creator }}, time: {{ topic.created }}
Number of comments in the topic: {{ comm_num }}
Leave a comment
{% if p.photo %}
{% else %}
{% endif %}
{{ topic.creator }}
Created: {{topic.created|date:"d.m.Y H:i"}}
{% autoescape off %}
{{topic.first_comment|linebreaks|truncatewords:200}}
{% endautoescape %}
Edit
{% for p in page_obj %}
{% if p.photo %}
{% else %}
{% endif %}
{{ p.author }}
Created: {{p.created|date:"d.m.Y H:i"}}
{% autoescape off %}
{{p.content|linebreaks|truncatewords:200}}
{% endautoescape %}
Edit
Delete
{% endfor %}
{% endblock %}
{% if is_paginated %}
{% if page_obj.has_other_pages %}
- {% for p in paginator.page_range %}
{% if page_obj.number == p %} - {{ p }}
{% elif page_obj.number|add:-1 and page_obj.number|add:1 %} -
{{ p }}
{% endif %}
{% endfor %}
{% endif %}
urls.py:
from django.urls import path
from forum.views import *
app_name = 'forum'
urlpatterns = [
path('', SubForumListView.as_view(), name='forum'),
path('/', TopicListView.as_view(), name='subforum'),
path('/add_topic/', AddTopic.as_view(), name="add_topic"),
path('/topics//', ShowTopic.as_view(), name='topic'),
path('/topics//add_comment/', AddComment.as_view(), name="add_comment"),
path('/topics///edit_comment/', UpdateComment.as_view(), name="edit_comment"),
path('/topics///delete_comment/', DeleteComment.as_view(), name="delete_comment"),
]
Модели тем и комментариев:
class Topic(models.Model):
subject = models.CharField(verbose_name='Заголовок', max_length=255, unique=True)
first_comment = models.TextField(verbose_name='Сообщение', max_length=2000, default='')
slug = models.SlugField(default='', unique=True, max_length=25, editable=False)
subforum = models.ForeignKey('Subforum',
verbose_name='Раздел',
on_delete=models.CASCADE,
related_name='subforum')
creator = models.ForeignKey(User,
verbose_name='Создатель темы',
on_delete=models.SET('deleted'),
related_name='creator')
created = models.DateTimeField(auto_now_add=True)
closed = models.BooleanField(default=False)
objects = models.Manager()
class Meta:
ordering = ['id']
verbose_name = 'Обсуждения'
verbose_name_plural = 'Обсуждения'
def __str__(self):
return self.subject
def save(self, *args, **kwargs):
if not self.id:
self.slug = f'topic-{slugify(self.subject)}'
return super(Topic, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('forum:topic', kwargs={'topic_slug': self.slug, 'subforum_slug': self.subforum.slug})
class Comment(models.Model):
topic = models.ForeignKey('Topic',
verbose_name='Тема',
on_delete=models.CASCADE,
related_name='comments')
author = models.ForeignKey(User,
verbose_name='Комментатор',
on_delete=models.SET('deleted'),
related_name='author')
content = models.TextField(verbose_name='Текст', max_length=2000)
created = models.DateTimeField(verbose_name='Дата публикации', auto_now_add=True)
updated = models.DateTimeField(verbose_name='Дата изменения', auto_now=True)
objects = models.Manager()
class Meta:
ordering = ['created']
verbose_name = 'Комментарии'
verbose_name_plural = 'Комментарии'
def __str__(self):
return f'Post of {self.topic.subject} is posted by {self.author.username}.'
Подробнее здесь: https://stackoverflow.com/questions/791 ... on-numbers
Мобильная версия