Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-';非类型';对象没有属性';螺纹';_Django_Django Models - Fatal编程技术网

Django-';非类型';对象没有属性';螺纹';

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

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

每次我尝试进入分类页面查看该分类中的帖子时,我都会遇到这样的错误,即“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 = 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。