Объект 'Category' не имеет атрибута 'post_set' - PullRequest
0 голосов
/ 22 октября 2019

, поэтому я пытаюсь добавить систему категорий для сообщений, следуя инструкциям на этом сайте https://djangopy.org/how-to/how-to-implement-categories-in-django/ (я немного изменил свой код)

Все работает как создание категорий, добавлениесообщение, просматривая сообщение, но если я пытаюсь перейти на страницу категории, чтобы просмотреть сообщения только в этой категории, то есть / category / CATNAME, но он показывает мне эту ошибку

Объект 'Category' не имеет атрибута'post_set'

models.py

from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify
from markdownx.models import MarkdownxField
from markdownx.utils import markdownify
from taggit.managers import TaggableManager


class Category(models.Model):
    name = models.CharField(max_length=100)
    short_desc = models.CharField(max_length=160)
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)
        verbose_name_plural = "Categories"

    def __str__(self):
        full_path = [self.name]
        k = self.parent

        while k is not None:
            full_path.append(k.name)
            k = k.parent

        return ' -> '.join(full_path[::-1])

    def save(self, *args, **kwargs):
        value = self.title
        self.slug = slugify(value, allow_unicode=True)
        super().save(*args, **kwargs)


class Thread(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    content = MarkdownxField()
    tags = TaggableManager()
    slug = models.SlugField(unique=True)
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = 'Threads'

    def get_cat_list(self):
        k = self.category
        breadcrumb = ["dummy"]
        while k is not None:
            breadcrumb.append(k.slug)
            k = k.parent

        for i in range(len(breadcrumb)-1):
            breadcrumb[i] = '/'.join(breadcrumb[-1:i-1:-1])
        return breadcrumb[-1:0:-1]

    def save(self, *args, **kwargs):
        value = self.title
        self.slug = slugify(value, allow_unicode=True)
        super().save(*args, **kwargs)

views.py

from django.shortcuts import render, redirect, get_object_or_404
from .models import Category, Thread
from .forms import NewThreadForm

def show_thread_view(request, hierarchy=None):
    category_slug = hierarchy.split('/')
    category_queryset = list(Category.objects.all())
    all_slugs = [ x.slug for x in category_queryset ]
    for slug in category_slug:
        if slug in all_slugs:
            # parent = get_object_or_404(Category, slug=slug, parent=parent)
            parent = Category.objects.filter(slug__in=category_slug, parent=None).first()


    thread = get_object_or_404(Thread, slug=slug)
    instance = get_object_or_404(Thread, slug=slug)
    breadcrumbs_link = instance.get_cat_list()
    category_name = [' '.join(i.split('/')[-1].split('-')) for i in breadcrumbs_link]
    breadcrumbs = zip(breadcrumbs_link, category_name)

    context = {
        'thread': thread,
        'instance': instance,
        'breadcrumbs': breadcrumbs,
    }

    return render(request, "forums/threads/thread_detail.html", context)

def show_category_view(request, hierarchy=None):
    category_slug = hierarchy.split('/')
    category_queryset = list(Category.objects.all())
    all_slugs = [ x.slug for x in category_queryset ]
    parent = None
    for slug in category_slug:
        if slug in all_slugs:
            #parent = get_object_or_404(Category, slug=slug, parent=parent)
            parent = Category.objects.filter(slug__in=category_slug, parent=None).first()

    context = {
        'category': parent,
        'post_set': parent.post_set.all(),
        'sub_categories': parent.children.all(),
    }
    return render(request, "forums/categories.html", context)


def new_thread_form_view(request):
    if request.method == "POST":
        form_data = request.POST or None
        form = NewThreadForm(form_data)
        if form.is_valid():
            news = form.save(commit=False)
            news.author = request.user
            news.save()
            return redirect('/forums')
    else:
        form = NewThreadForm()

    context = {
        'form': form
    }
    return render(request, "forums/threads/thread_form.html", context)

Categories.html

{% extends 'base.html' %}
{% load static  %}
{% block content %}
<br>
{% if sub_categories %}
    <h3>Sub Categories</h3>
    {% for i in sub_categories %}
        <a href="{{ i.slug }}"> {{ i.name }} </a>
    {% endfor %}
{% endif %}

<div class="row small-up-1 medium-up-3" >
{% if post_set %}
{% for i in post_set %}
    <div class="columns">
        <div class=" card-article-hover card">
          <a href="{{ i.slug }}">
            <img  src="{{ i.cover_photo.url }}">
          </a>
          <div class="card-section">
            <a href="{{ i.slug }}">
              <h6 class="article-title">{{ i.title | truncatechars:30}}</h6>
            </a>
          </div>
          <div class="card-divider flex-container align-middle">
            <a href="" class="author">{{ i.user.get_full_name }}</a>
          </div>
          <div class="hover-border">
          </div>
        </div>
    </div>
{% endfor %}
{% endif %}
</div>
{% endblock %}

1 Ответ

0 голосов
/ 22 октября 2019

Модель, которая имеет отношение ForeignKey к модели Category, равна Thread (согласно общему коду из вопроса). Поэтому вам нужно использовать parent.thread_set.all(), чтобы получить все темы, связанные с этой категорией. Также, если вы определите related_name внутри Thread to Category ForeignKey, как показано в следующем примере:

class Thread(..):
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE, <b>related_name='threads'</b>)

Тогда вы можете получить потоки по parent.threads.all(). Более подробную информацию можно найти в документации .

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