как разделить просмотр публикации на одной странице в django

#python #django

#python #django

Вопрос:

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

Мой вопрос в том, как я могу разделить разделы страницы. что-то вроде этого. объясните представление

каким должен быть подход к созданию такого вида просмотра.

это мои сообщения view.py

posts/view.py

 class PostListView(ListView):
    model = Post
    template_name = 'posts/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']

    def get_queryset(self):
        if not self.request.user.is_authenticated:
            return Post.objects.all()[:10]
        else : 
            return super().get_queryset()
  

posts/models.py

 from django.db import models
from django.utils import timezone
from slugger import AutoSlugField
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.

def upload_location(instance, filename):
    return "%s/%s" %(instance.slug, filename)

class Category(models.Model):
    title = models.CharField(max_length= 60)
    slug = AutoSlugField(populate_from='title')
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='children',on_delete=models.CASCADE)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title



class Post(models.Model):
    title = models.CharField(max_length=120)
    slug = AutoSlugField(populate_from='title')
    image = models.ImageField(
        upload_to=upload_location,
        null=True, 
        blank=True,
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return self.title


    def get_absolute_url(self, slug=None):
        return reverse("posts-detail", kwargs={"slug": self.slug})
  

Комментарии:

1. Просто добавьте некоторый тип записи в Post модель и отобразите его в соответствии с типами. Один тип — один раздел.

2. @SergeyPugach не могли бы вы, пожалуйста, объяснить, что я не понимаю, я опубликовал код своей модели, взгляните на него, что вы предлагаете. Я новичок в django и тоже немного запутался.

3. Итак, у вас есть список сообщений, назначенных категориям (1 сообщение может быть назначено максимум 1 категории). И вы хотите отобразить все категории и 10 последних сообщений в каждой. Верно?

4. @DmitryBelaventsev да, это то, чего я хочу

Ответ №1:

У вас есть записи, распределенные по категориям. Каждая запись может быть отнесена только к одной категории (поскольку у вас есть FK от Post до Category ). И вы хотите отображать все категории и 10 последних сообщений под каждой из них.

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

 class Post(models.Model):

    title = models.CharField(max_length=255)
    category = models.ForeignKey('Category', on_delete=models.CASCADE, related_name='posts')
    date_posted = models.DateTimeField(default=timezone.now)


class Category(models.Model):

    title = models.CharField(max_length=255)

    @property
    def posts_for_frontpage(self):
        return self.posts.order_by('-date_posted')[:10]


class FrontpageView(ListView):

    model = Category
    template_name = 'frontpage.html'
    context_object_name = 'categories'

    def get_queryset(self):
        # select some categories for frontpage
        # all by default
        return Category.objects.all()
  

а затем в шаблоне

 {% for category in categories %}
    <h1>{{ category.title }}</h1>
    <hr />
    {% for post in category.posts_for_frontpage %}
        <h4>{{ post.title }}</h4>
    {% endfor %}
    <br />
    <br />
{% endfor %}
  

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

Комментарии:

1. Я пытался поместить это, но это не приводит к отображению сообщений.

2. не могли бы вы попробовать {% for post in category.posts_for_frontpage.all() %} ? отображаются ли у вас заголовки категорий?

3. это выдает ошибку. да, отображаются заголовки категорий.

4. Вы получаете сообщение об ошибке после добавления .all() ? Если да, то какую ошибку вы видите?

5. @adityakumar пожалуйста, дайте мне знать, если вам понадобится дополнительная помощь