Python Django-DetailView-`get_object`函数混淆

Python Django-DetailView-`get_object`函数混淆,python,django,django-class-based-views,detailview,Python,Django,Django Class Based Views,Detailview,我是CBV的新手。不知道为什么这不起作用 views.py class ItemDetailView(详细视图): ''显示单个项目'' 型号=项目 template_name='精品店/item.html' 上下文\对象\名称='item' #指定型号后,以下代码将是多余的,不是吗??然而。。。 #def get_对象(自身): #返回get_object_或_404(Item,pk=self.kwargs.get('Item_pk')) def获取上下文数据(自身,**kwargs): co

我是CBV的新手。不知道为什么这不起作用

views.py

class ItemDetailView(详细视图):
''显示单个项目''
型号=项目
template_name='精品店/item.html'
上下文\对象\名称='item'
#指定型号后,以下代码将是多余的,不是吗??然而。。。
#def get_对象(自身):
#返回get_object_或_404(Item,pk=self.kwargs.get('Item_pk'))
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
#添加导航栏链接文本的类别
上下文['categories']=Category.objects.all()
打印(“\ncontext=”,上下文“\n”)
返回上下文
AttributeError at/item_8/Generic detail view ItemDetailView必须在URLconf中使用对象pk或slug调用。
而且上下文没有被打印出来


如果我在代码中添加
get\u object
,它工作正常:


类ItemDetailView(DetailView):
''显示单个项目''
#型号=项目
template_name='精品店/item.html'
#上下文\对象\名称='item'
def get_对象(自身):
返回get_object_或_404(Item,pk=self.kwargs.get('Item_pk'))
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
#添加导航栏链接文本的类别
上下文['categories']=Category.objects.all()
打印(“\ncontext=”,上下文“\n”)
返回上下文

但是,如果我将
get_object
函数更改为:

def get_对象(self):
obj=super()
obj=get\u object\u或_404(Item,pk=self.kwargs.get('Item\u pk'))
#obj=obj.filter(pk=self.kwargs.get('item_pk'))#不工作,同样的错误
#obj=obj.get(pk=self.kwargs.get('item_pk'))#不起作用,同样的错误
返回obj
/item_8/ItemDetailView中配置不当的
缺少查询集。定义ItemDetailView.model、ItemDetailView.queryset或覆盖ItemDetailView.get\u queryset()。
我很困惑。。。DetailView应该可以工作,而不必定义
get\u对象


其他文件: url.py

app_name='精品店'
URL模式=[
#显示索引页
路径(“”,views.IndexView.as_view(),name='index'),
#显示特定项目
路径('item\/',views.ItemDetailView.as\'view(),name='item'),
#展示男士或女士的产品类别
路径('/',views.CategoryListView.as_view(),name='show-all'),
#为男性或女性显示特定类别
路径('/cat\/',views.CategoryListView.as_view(),name='category'),
#在特定类别下为男性或女性显示特定子类别
路径('/cat\/subcat\/',views.CategoryListView.as_view(),name='subcategory'),
]
models.py

类项(models.Model):
“每个项目代表一种产品”
类别=模型.ForeignKey(类别,on_delete=模型.CASCADE)
子类别=models.ForeignKey(
子类别,on_delete=models.CASCADE,null=True,blank=True)
name=models.CharField(最大长度=100)
description=models.TextField(空白=True)
price=models.IntegerField(默认值为0)
折扣=模型.IntegerField(null=True,blank=True)
上传日期=models.datetime字段(
自动_now_add=True,null=True,blank=True)
类元:
订购=['-上传日期']
定义(自我):
返回self.name
def折扣价格(自身):
''计算折扣后的价格''
返回整数(自付价格*(100-自付折扣)*0.01)
def get_item_url(自身):
返回反向('finite:item',kwargs={'item_pk':self.pk})
item.html


{%if item.discount%}

₽ {{item.price}}
₽ {{项目.折扣价格}
({item.discount}}%)

{%else%} ₽;{{item.price}}

{%endif%}
您的第一个示例是正确的,您不需要显式定义
get\u object()
,但在使用详细信息CBV时,您应该在url路径中使用
pk
参数,而不是
item\u pk

path('item_<int:pk>/', views.ItemDetailView.as_view(), name='item'),
发件人:

此处的URLconf使用命名组pk-此名称是默认名称 DetailView用于查找用于 过滤查询集

如果你想给这个组打电话,你可以设置pk_url_kwarg 在视图上。更多详细信息可以在DetailView的参考中找到

class ItemDetailView(DetailView):
    pk_url_kwarg = 'item_pk'