You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:32