Как я могу сделать просмотр по категориям, чтобы перечислить все посты со связанной категорией в Django, используя представления на основе классов - PullRequest
0 голосов
/ 11 марта 2019

Я хочу знать, как сделать просмотр страницы категории с помощью представления на основе классов. Я знаю, как сделать это в представлении на основе функций с помощью get_object_or_404(category, slug=None) Но я не совсем понимаю, как это сделать в представлениях на основе классов.Я пытался Google это, но я не могу найти что-либо связанное с этим в представлении класса.

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

мой код

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)

    class Meta:
        verbose_name_plural = 'categories'
    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title

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


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, related_name='postcategory')
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta: 
        ordering = ['-date_posted']

    def __str__(self):
        return self.title


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

urls.py

from django.urls import path
from django.urls import path, include
from .views import PostView, PostDetailView,LatestPostView, CategoryPostListView

urlpatterns = [
    path('', PostView.as_view(), name='posts-home'),
    path('latest/', LatestPostView.as_view(), name='posts-latest'),
    path('<slug>', PostDetailView.as_view(), name='posts-detail'),
    path('category/<slug>', CategoryPostListView.as_view(), name='category-detail'),

]

views.py

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin

from django.shortcuts import redirect, render,get_object_or_404

#class based view
from django.views.generic import ListView, DetailView
from .models import Post, Category

class PostView(ListView):
   template_name = 'posts/home.html'
   model = Category
   context_object_name = 'all_categs'

   def get_queryset(self):
      if self.request.user.is_authenticated:        
         return Category.objects.all()
      else:
         return Category.objects.all().exclude(title__iexact = 'Featured')[:6]

   def get_context_data(self):
      if not self.request.user.is_authenticated:   
         fcategory = Category.objects.get(title__iexact = 'Featured')        
         context = super(PostView, self).get_context_data()
         context['latest_posts'] = Post.objects.exclude(category= fcategory).order_by('-date_posted')[0:6]
         context['featured_posts'] = Post.objects.all().filter(category= fcategory).order_by('-date_posted')[0:6]
         return context
      else:
         fcategory = Category.objects.get(title__iexact = 'Featured') 
         context = super(PostView, self).get_context_data()
         context['latest_posts'] = Post.objects.order_by('-date_posted')
         context['featured_posts'] = Post.objects.all().filter(category= fcategory).order_by('-date_posted')[0:6]
         return context

   # def get_success_url(self):
   #     return reverse('home') #add your path


class LatestPostView(LoginRequiredMixin, ListView):
   template_name = 'posts/post_latest.html'
   model = Post
   context_object_name = 'Posts'
   ordering = ['-date_posted']
   paginate_by = 6


class PostDetailView(LoginRequiredMixin,DetailView):
    model = Post
    template_name = 'posts/post_detail.html'



class CategoryPostListView(LoginRequiredMixin, ListView):
   model = Category
   template_name = 'posts/category_detail.html'

   # def get_queryset(self):
   #    category = get_object_or_404(Category, )

Я думал об определении get_queryset внутри CategoryPostListView.Но я не уверен, будет ли это работать или нет.

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Во-первых, если вы используете ListView и хотите отобразить список сообщений, тогда вам нужно model = Post.

Далее вы можете вызвать get_object_or_404 в методе get_queryset. Вы можете получить доступ к slug по URL с помощью `self.kwargs ['slug'].

Наконец, вы можете отфильтровать набор запросов, чтобы он возвращал сообщения только в этой категории.

class CategoryPostListView(LoginRequiredMixin, ListView):
    model = Post
    template_name = 'posts/category_detail.html'

    def get_queryset(self):
       category = get_object_or_404(Category, slug=self.kwargs['slug'])
       return super(CategoryPostListView, self).get_queryset().filter(category=category)

Обратите внимание, что ваша проблема очень похожа на раздел динамической фильтрации в документации.

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

Да.Вы можете использовать get_object_or_404 в представлениях на основе классов.просто добавьте это к своему CategoryPostListView:

class CategoryPostListView(LoginRequiredMixin, ListView):
    model = Post
    template_name = 'posts/category_detail.html'

    def get_queryset(self):
        category = get_object_or_404(Category, slug=self.kwargs['slug'])
        # do another stuffs here
        return Post.objects.filter(category=category)

для получения дополнительной информации вы можете прочитать динамическая фильтрация в представлениях на основе классов на официальном сайте django

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