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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:45:35