Django:TypeError在/ categories / sequence item 0:预期的str实例,找到的类别

时间:2017-07-23 19:45:02

标签: python django

我试图用Django编写电子短语,以帮助人们学习语言。或者实际上是具有新功能的旧版本的新版本。无论如何,我在这里的第一米处严重受伤。

我已经在数据库中添加了一些对象,并希望在"类别"中显示它们。网址。第一个网址http://127.0.0.1:8000/效果很好,给了我一个美妙的问候世界。但是,我需要将新应用程序连接到项目,当我尝试打开应用程序http://127.0.0.1:8000/categories/的网址时,浏览器会给我这样的信息:

TypeError at /categories/
sequence item 0: expected str instance, Category found

我的控制台抱怨应用程序的view.py,并在第9行output = ', '.join(categories)内。我发现它没有任何问题。这是整个views.py:

from django.http import HttpResponse
from django.shortcuts import render

from .models import Category


def category_list(request):
    categories = Category.objects.all()
    output = ', '.join(categories)
    return HttpResponse(output)

这是应用的url.py:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.category_list),
]

这是主要的url.py:

from django.conf.urls import url, include
from django.contrib import admin

from . import views

urlpatterns = [
    url(r'^categories/', include('phrasebooktwo.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.hello_world),
]

这是项目树:

bigboy_phrasebook
├── bigboy_phrasebook
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-35.pyc
│   │   ├── settings.cpython-35.pyc
│   │   ├── urls.cpython-35.pyc
│   │   ├── views.cpython-35.pyc
│   │   └── wsgi.cpython-35.pyc
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── phrasebooktwo
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-35.pyc
    │   ├── admin.cpython-35.pyc
    │   ├── models.cpython-35.pyc
    │   ├── urls.cpython-35.pyc
    │   └── views.cpython-35.pyc
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── __init__.py
    │   └── __pycache__
    │       ├── 0001_initial.cpython-35.pyc
    │       └── __init__.cpython-35.pyc
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py

如何让我的类别页面正常工作?在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

在使用join()之前,必须使用 str ()或 repr ()或在categories对象上返回字符串的任何其他方法。让我用一个简单的例子解释一下:

class Category:
    def __init__(self, name):
        self.name = name


items = [Category('jam')]
out = ', '.join(items)
print(out)

如果您运行此代码,您将得到" TypeError:序列项0:预期的str实例,找到的类别"

所以,你必须修改如下代码:

class Category:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name


items = [Category('jam').__str__()]
out = ', '.join(items)
print(out)

答案 1 :(得分:1)

def category_list(request):
    categories = Category.objects.all()
    output = ', '.join(categories)
    return HttpResponse(output)

此处categoriesqueryset对象因此,当您添加此join方法时,它会从instance迭代为queryset,而instance是对象模型。那么 concat join方法不起作用。在连接方法中使用str方法,如下所示

def category_list(request):
    categories = Category.objects.all()
    output = ', '.join(str(categories))
    return HttpResponse(output)

答案 2 :(得分:0)

啊,傻,我。我是根据www.teamtreehouse.com上的教程做到这一点的,我确信我已经观看了整个视频" First App View"但我没有。对不起有问题的人,感谢您的帮助!老师故意编写了首先没有工作的代码,然后用这段代码解释了正确的方法,在我自己的应用程序中看起来像这样:

def category_list(request):
    categories = Category.objects.all()
    output = ', '.join([str(category) for category in categories])
    return HttpResponse(output)

现在它有效。我必须记得将来看完这些视频。