Django报错AttributeError:'customer'对象无'get'属性,求解决方案
Django AttributeError 排查与解决
问题现象
访问路径 /customers/f0e85ace-438f-4c61-a129-6d5986e6f346/ 时触发错误:
AttributeError at /customers/f0e85ace-438f-4c61-a129-6d5986e6f346/ 'customer' object has no attribute 'get'
相关代码
models.py
from django.db import models from django.core.validators import RegexValidator import uuid # Create your models here. class customer(models.Model): id=models.UUIDField(primary_key=True,default=uuid.uuid4) name=models.CharField(max_length=200,null=True) phone_no=models.CharField(max_length=200, validators= [RegexValidator(r'^\d{1,10}$')],null=True) email=models.EmailField(max_length=200,null=True) def __str__(self): return self.name class tag(models.Model): name=models.CharField(max_length=200,null=True) def __str__(self): return self.name class products(models.Model): id=models.UUIDField(primary_key=True,default=uuid.uuid4) categories=[ ('organic','organic'), ('inorganic','inorganic') ] name=models.CharField(max_length=200,null=True) price=models.FloatField(null=True) manufacturedate=models.DateTimeField(auto_now_add=True,null=True) description:models.TextField(null=True) categories=models.CharField(max_length=200,null=True,choices=categories) tag=models.ManyToManyField(tag) def __str__(self): return self.name class order(models.Model): id=models.UUIDField(primary_key=True,default=uuid.uuid4) status=[ ('pending','pending'), ('out of stock','out of stock',), ('Delivered',('Delivered')) ] ordered_date=models.DateTimeField(auto_now_add=True) status=models.CharField(max_length=200,null=True,choices=status) customer=models.ForeignKey(customer,null=True,on_delete=models.SET_NULL) product=models.ForeignKey(products,null=True,on_delete=models.SET_NULL)
urls.py
from django.urls import path from . import views urlpatterns=[ path('',views.home), path('products/',views.product), path('customers/<str:pk>/',views.customer), ]
views.py
from django.shortcuts import render from .models import * # Create your views here. def home(request): customers=customer.objects.all() orders=order.objects.all() total_customers=customers.count() total_orders=orders.count() delivered=orders.filter(status='Delivered').count() pending=orders.filter(status='pending').count() context={'customers':customers,'orders':orders,'total_customers':total_customers, 'total_orders':total_orders,'delivered':delivered, 'pending':pending } return render(request,'accounts/home.html',context) def product(request): product=product return render(request,'accounts/products.html') def Customer(request,pk): Customer=customer.objects.get(id=pk) return render(request,'accounts/customers.html')
错误原因
- 视图函数名称不匹配:urls.py中配置的视图是
views.customer,但views.py中定义的视图函数是Customer(首字母大写),Django找不到对应视图,会尝试导入同名的customer模型类,把模型类当成视图函数调用。 - 模型类被当作视图函数执行:当Django调用
customer模型类时,会触发类的实例化逻辑,而视图要求返回可响应的对象(比如HttpResponse),但模型实例没有get方法,因此抛出AttributeError。 - 额外问题:views.py中的
product函数存在循环赋值product=product,会导致局部变量未定义错误;models.py中products类的description用了冒号:而非等号=,会变成类属性注释而非数据库字段。
解决办法
1. 修正视图函数名称匹配问题
- 方案一:修改urls.py,将
views.customer改为views.Customer:
from django.urls import path from . import views urlpatterns=[ path('',views.home), path('products/',views.product), path('customers/<str:pk>/',views.Customer), # 首字母大写匹配视图函数 ]
- 方案二:修改views.py中的视图函数名为小写
customer,同时避免变量名与模型类重复:
def customer(request,pk): customer_obj = customer.objects.get(id=pk) return render(request,'accounts/customers.html', {'customer': customer_obj})
2. 修复product视图的循环赋值问题
def product(request): products_list = products.objects.all() # 查询所有产品数据并传递到模板 return render(request,'accounts/products.html', {'products': products_list})
3. 修复products模型的字段定义错误
将description:models.TextField(null=True)改为:
description = models.TextField(null=True)
4. 规范命名(可选但推荐)
遵循Django惯例,模型类采用大驼峰命名法:
- 将
customer改为Customer - 将
products改为Product - 将
order改为Order - 将
tag改为Tag
这样能避免变量名与类名混淆,大幅提升代码可读性。
内容的提问来源于stack exchange,提问作者mikasa ackermann
相关产品推荐
相关产品推荐

