Python ';类别';对象没有属性';后置集';
因此,我正试图通过遵循这个网站上的教程为帖子添加一个分类系统(我稍微修改了代码) 所有操作都像创建类别、添加帖子、查看帖子,但是如果我尝试转到类别页面仅查看该类别中的帖子,那么/category/CATNAME会显示此错误 “Category”对象没有属性“post_set” models.pyPython ';类别';对象没有属性';后置集';,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
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你可以试试。