как разделить пост просмотр на той же странице в Django - PullRequest
0 голосов
/ 03 марта 2019

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

Мой вопрос заключается в том, как разделить разделы страницы. Примерно так.explain view

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

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

записи/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 Ответ

0 голосов
/ 04 марта 2019

У вас есть сообщения, отнесенные к категориям.Каждое сообщение может быть отнесено только к одной категории (так как у вас есть 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, чтобы получить все связанные сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...