【问题标题】:type object 'Album' has no attribute 'object'类型对象“专辑”没有属性“对象”
【发布时间】:2018-04-24 18:50:49
【问题描述】:

我是 Django 和网络编码的新手。

我正在关注 Bucky tuts:Django 初学者教程 - 29 - 通用视图

& 我正在尝试获取我的音乐(索引)页面,但它在浏览器中显示了该错误:

/music/ 类型对象“专辑”中的 AttributeError 没有属性 '对象'

&这里是我的views.py:

from django.http import HttpResponse, Http404
from django.shortcuts import render , get_object_or_404
from .models import Album,song
from django.views import generic

"""
def index(request):
    all_albums = Album.objects.all()
    context = {'all_albums': all_albums}
    return render(request, 'music/index.html', context)
"""

class IndexView (generic.ListView):
    template_name = 'music/index.html'
    context_object_name = 'all_albums'

    def get_queryset(self):
        return Album.object.all()

'''
class DetailView (generic.DetailView):
    model = Album
    template_name = "music/details.html"
'''


def details(request, album_id):
    try:
        album = Album.objects.get(pk=album_id)
    except Album.DoesNotExist:
        raise Http404("Album Does Not Exists !")
    return render(request, 'music/details.html', {'album': album})

def favourite (request , album_id):
    album = get_object_or_404 (Album , pk=album_id)
    try:
        selected_song = album.song_set.get(pk=request.POST['song'])
    except(KeyError, song.DoesNotExist):
        return render(request, 'music/details.html', {
            'album':album,
            'error_message': "you entered wrong"
        })
    else:
        selected_song.is_favorite = False
        selected_song.save()


        return render(request,'music/details.html' , {'album':album})

models.py

from django.db import models

# Create your models here.

class Album (models.Model):
    artist = models.CharField(max_length = 100)
    album_title = models.CharField(max_length = 100)
    genre = models.CharField(max_length = 50)
    album_logo = models.CharField(max_length = 1000)

    def __str__(self):
        return self.album_title + " - " + self.artist


class song (models.Model):
    album = models.ForeignKey(Album , on_delete=models.CASCADE)
    file_type = models.CharField(max_length = 10)
    song_title = models.CharField(max_length = 100)
    is_favourite = models.BooleanField(default=False)
    def __str__(self):
        return self.song_title

index.html

{% extends 'music/base.html' %}
{% block title %}Main : MuSiC {% endblock %}

{% block body %}
<ul>
    {% for album in all_albums %}
    <li><a href="{% url 'music:details' album.id %}">{{ album.album_title }}</a></li>
    {% endfor %}
</ul>
{% endblock %}

#/music/{{ album.id }}

项目结构

{ (website) project dir }
|-music
..|-migrations
..|-static
..|-templates
....|-music
......|-base.html
......|-details.html
......|-index.html
|-__init__.py
|-admin.py
|-apps.py
|-models.py
|-tests.py
|-urls.py
|-views.py
|-website
..|-__init__.py
..|-settings.py
..|-urls.py
..|-wsgi.py
|-db.sqlite3
|-manage.py

我不知道问题出在哪里:(

顺便说一句,我还没有学过很多编码术语,这就是为什么我可能会问很多我搜索解决方案但不理解其他问题答案的答案。

【问题讨论】:

  • 在您的代码中的某处,您输入了Album.object 而不是Album.objects
  • 查看@wpercy的答案

标签: python django


【解决方案1】:

Album.object 不存在;你应该写Album.objects

class IndexView (generic.ListView):
    template_name = 'music/index.html'
    context_object_name = 'all_albums'

    def get_queryset(self):
        # return Album.object.all()  <-- Remove this
        return Album.objects.all()

附带说明,保留字不能是 python 属性。这是设计使然,因为禁止使用这些词会使解析变得更加容易。

Why can't attribute names be Python keywords?

【讨论】:

    猜你喜欢
    • 2016-06-03
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多