Django项目报错:'function' object has no attribute 'objects'求助
问题原因分析
你遇到的AttributeError核心原因是命名冲突:在views.py里,你先导入了listing模型类,随后又定义了一个同名的视图函数def listing(request):——Python中后定义的同名变量会覆盖之前的引用,所以当index函数里调用listing.objects.all()时,这里的listing已经变成了视图函数,而非模型类,函数自然没有objects属性。
另外还有一个小问题:你在context里把查询结果赋值给了patients键,但模板里用的是listings变量,这会导致模板无法获取数据,即使修复了第一个错误,页面也会显示No Patients。
修复步骤及代码示例
1. 重命名视图函数,避免与模型冲突
把视图函数listing改成其他名称(比如listing_detail),同时更新urls.py里的对应路径:
修改后的views.py:
from django.shortcuts import render from listings.models import listing # Create your views here. def index(request): listings = listing.objects.all() # 修正context键名,和模板变量保持一致 context = { 'listings' : listings } return render(request, 'listings/listings.html') # 重命名视图函数,避免和模型名冲突 def listing_detail(request, listing_id): return render(request, 'listings/listing.html')
修改后的urls.py:
from django.urls import path from .import views urlpatterns = [ path('', views.index, name ='listings'), # 对应更新视图函数名 path('<int:listing_id>', views.listing_detail, name ='listing'), ]
2. (可选但推荐)规范模型命名
按照Django和PEP8的最佳实践,模型类名应该使用大驼峰命名法(比如Listing而非listing),这样能从根源减少命名冲突的概率。如果修改模型名,记得同步更新views.py里的导入和查询代码:
# 导入修改后的模型 from listings.models import Listing def index(request): # 使用大写开头的模型类 listings = Listing.objects.all() context = { 'listings' : listings } return render(request, 'listings/listings.html')
额外说明
- 模板里的
{% for listing in listings %}现在能正确获取到context里的查询集,数据库中的记录会正常渲染出来; - 如果后续需要给详情页传递单个listing数据,也可以在
listing_detail函数里通过listing.objects.get(id=listing_id)(或get_object_or_404)获取数据并传入模板。
内容的提问来源于stack exchange,提问作者Krychaz
相关产品推荐
相关产品推荐

