Python ';类别';对象没有属性';后置集';

Python ';类别';对象没有属性';后置集';,python,django,Python,Django,因此,我正试图通过遵循这个网站上的教程为帖子添加一个分类系统(我稍微修改了代码) 所有操作都像创建类别、添加帖子、查看帖子,但是如果我尝试转到类别页面仅查看该类别中的帖子,那么/category/CATNAME会显示此错误 “Category”对象没有属性“post_set” models.py from django.db import models from django.contrib.auth.models import User from django.utils.text impor

因此,我正试图通过遵循这个网站上的教程为帖子添加一个分类系统(我稍微修改了代码)

所有操作都像创建类别、添加帖子、查看帖子,但是如果我尝试转到类别页面仅查看该类别中的帖子,那么/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 %}

{%extends'base.html%}
{%load static%}
{%block content%}

{%if子_类别%} 子类别 {i在子_类别中的百分比%} {%endfor%} {%endif%} {%if post_set%} {post_set%中的i的%s} {%endfor%} {%endif%} {%endblock%}
类别
模型有外键关系的模型是
线程
(根据问题中的共享代码)。因此,您需要使用
parent.thread\u set.all()
来获取与该类别相关的所有线程。另外,如果您在类别ForeignKey的内部线程中定义了
相关的\u name
,如以下示例所示:

class Thread(..):
    category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE, related_name='threads')
类线程(…):
category=models.ForeignKey('category',null=True,blank=True,on\u delete=models.CASCADE,related\u name='threads')

然后您可以通过
parent.threads.all()
获得线程。更多信息可以在中找到。

您的
类别
类没有字段名
post\u set
。我在任何地方都没有看到教程中提到过它,那么当他们访问类别页面时,我该如何回去显示该类别中的所有帖子呢@Usman Maqbool
获取对象或404(类别,slug=slug,parent=parent)
工作正常??抱歉,有点困惑,这将显示所有的文章在类别中使用categories.html tenplate你可以试试。