Django-';非类型';对象没有属性';螺纹';
大家好,我正试图通过这个网站上的教程为帖子添加一个分类系统(我稍微修改了代码) 每次我尝试进入分类页面查看该分类中的帖子时,我都会遇到这样的错误,即“NoneType”对象没有属性“threads” models.py:Django-';非类型';对象没有属性';螺纹';,django,django-models,Django,Django Models,大家好,我正试图通过这个网站上的教程为帖子添加一个分类系统(我稍微修改了代码) 每次我尝试进入分类页面查看该分类中的帖子时,我都会遇到这样的错误,即“NoneType”对象没有属性“threads” models.py: from django.db import models from django.urls import reverse from django.utils.text import slugify class Category(models.Model): name
from django.db import models
from django.urls import reverse
from django.utils.text import slugify
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.name
self.slug = slugify(value, allow_unicode=True)
super().save(*args, **kwargs)
class Thread(models.Model):
...
category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE, related_name='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]
...
views.py:
from django.shortcuts import render, HttpResponseRedirect
from django.contrib import messages
from .models import Category, Thread
from .forms import SubmitScamNumber
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,
'threads': parent.threads.all(),
'sub_categories': parent.children.all(),
}
return render(request, "categories.html", context)
...
categories.html:
{% extends 'base.html' %}
{% block content %}
{% if sub_categories %}
<h3>Sub Categories</h3>
{% for i in sub_categories %}
<a href="{{ i.slug }}"> {{ i.name }} </a>
{% endfor %}
{% endif %}
{% if threads %}
{% for i in threads %}
<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 %}
{% endblock content %}
{%extends'base.html%}
{%block content%}
{%if子_类别%}
子类别
{i在子_类别中的百分比%}
{%endfor%}
{%endif%}
{%if线程%}
{%i在线程%}
{%endfor%}
{%endif%}
{%endblock内容%}
在显示类别视图中
设置父项=无
。然后,如果有任何源于层次结构的slug
,则在其上循环,并将父级
重新分配为类别
的实例。但是,如果在category\u slug
或中没有slug,则在all\u slug
或行category.objects.filter(slug\u in=category\u slug,parent=None)中找不到slug。first()
不返回category
的实例,然后,parent
的值将保持为None
,然后当您尝试访问threads
对象的None
属性时,就像您在这里所做的那样
parent.threads.all() # parent = None
…您看到的异常将发生
因此,正如错误告诉您的那样,'NoneType'对象没有属性“threads”
,因为parent
仍然是最初定义的None
此函数中潜伏着另一个空检查错误
def show_category_view(request, hierarchy=None):
category_slug = hierarchy.split('/')
将hierarchy
参数的默认值设置为None
,然后对其调用split
,即使该值可能是None
。如果在None
上调用split
,它将抛出类似的AttributeError
您也不需要将list
转换为category\u queryset=list(category.objects.all())
。queryset已经是类似列表的对象,可以循环、实现迭代器协议等(事实上,这样做会丢掉queryset接口为您提供的所有好处)。在这里,您只需执行以下操作:
all_slugs = [x.slug for x in Category.objects.all()]
如果所有slug中的slug:
永远不能为true。