Django: Как фильтровать и отображать посты из категорий на странице - PullRequest
1 голос
/ 29 июня 2019

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

Я думаю, что-то не так с функцией get_queryset в CategoryListView.

'''
models.py 
'''
from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    category = models.ForeignKey(
        'Category', 
        on_delete=models.SET_NULL,
        null=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})



class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=150, unique=True)

    def __str__(self):
        return self.name 

    def get_absolute_url(self):
        return reverse('post-category', kwargs={'pk': self.pk})




'''
views.py
'''
from django.views.generic import ListView    
from .models import Post, Category



class CategoryListView(ListView):
    model = Post
    template_name = 'posts/post_category.html'

    def get_queryset(self):
        category = get_object_or_404(Category,   id=self.kwargs.get('category__name'))
        return Posts.objects.filter(category_name=category)




'''
urls.py
'''
from .views import CategoryListView


urlpatterns = [
    # urlpatterns for other pages left out for better readability
    CategoryListView.as_view(), name='post-category')
]

Код дает мне 404 и сообщение, что ни одна категория не соответствуетмой запрос.

1 Ответ

0 голосов
/ 29 июня 2019

Функция get_queryset [Django-doc] должна возвращать что-то вроде:

class CategoryListView(ListView):

    # ...

    def get_queryset(self):
        return Post.objects.filter(<b>category_id=self.kwargs.get('pk')</b>)

Кроме того, в вашем URL вам нужно будет использовать шаблон с параметром pk, например:

urlpatterns = [
    path(<b>'category/<int:pk>'</b>, CategoryListView.as_view(), name='post-category')
]

При этом, если вы хотите отобразить информацию о категории, возможно, имеет смысл сделать ее DetailView [Django-doc] , а затем выполнить запрос отношение обратное, вроде:

class CategoryDetailView(DetailView):
    model = <b>Category</b>
    <b>context_object_name = 'category'</b>
    template_name = 'posts/post_category.html'

и в шаблоне вы можете визуализировать данные с помощью:

Category name: {{ <b>category.name</b> }}
{% for <b>post</b> in <b>category.post_set.all</b> %}
    post: {{ <b>post.title</b> }}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...