python - Django AttributeError:'Cart' 对象没有属性'get'
问题描述
我的 django 项目出现此错误:
Request Method: GET
Request URL: http://127.0.0.1:8000/cart/
Exception Type: AttributeError at /cart/
Exception Value: 'Cart' object has no attribute 'get'
这是carts.views.py:
from django.shortcuts import render, redirect, get_object_or_404
from store.models import Product
from .models import Cart, CartItem
# Create your views here.
def _cart_id(request):
cart = request.session.session_key
if not cart:
cart = request.session.create()
return cart
def add_cart(request, product_id):
product = Product.objects.get(id=product_id)
try:
cart = Cart.objects.get(cart_id=_cart_id(request))
except Cart.DoesNotExist:
cart = Cart.objects.create(
cart_id = _cart_id(request)
)
cart.save()
try:
cart_item = CartItem.objects.get(product=product, cart=cart)
cart_item.quantity += 1
cart_item.save()
except CartItem.DoesNotExist:
cart_item = CartItem.objects.create(
product= product,
quantity= 1,
cart= cart,
)
cart_item.save()
return redirect('cart')
def cart(request):
return render(request, 'store/cart.html')
我试过了:
- 重写类'Cart'的名称
- 使用 objectDoesnotexist 而不是 DoesnotExit
- 仔细检查 models.py 中类的名称
我无法调试此错误。我多次忽略了我的代码,但无法理解错误在哪里产生。提前致谢。
编辑:
模型.py:
from django.db import models
from store.models import Product
# Create your models here.
class Cart(models.Model):
cart_id = models.CharField(max_length=250, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.cart_id
class CartItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='cart')
quantity = models.IntegerField()
is_active = models.BooleanField(default=True)
def __str__(self):
return self.product
编辑:完整追溯:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/cart/
Django Version: 3.2.3
Python Version: 3.9.1
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'category',
'accounts',
'store',
'carts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "D:\greatkart\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\greatkart\env\lib\site-packages\django\utils\deprecation.py", line 119, in __call__
response = self.process_response(request, response)
File "D:\greatkart\env\lib\site-packages\django\middleware\clickjacking.py", line 26, in process_response
if response.get('X-Frame-Options') is not None:
Exception Type: AttributeError at /cart/
Exception Value: 'Cart' object has no attribute 'get'
编辑:urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.Cart, name='cart'),
path('add_cart/<int:product_id>/', views.add_cart, name='add_cart'),
]
解决方案
由于这些错误,我开始使用“Model.objects.filter().first()”而不是“Model.objects.get()”。
你可以试试这个:
cart = Cart.objects.filter(cart_id=_cart_id(request).first()
if not cart:
new_cart = Cart(cart_id = _cart_id(request))
new_cart.save()
此方法为您提供具有正确“cart_id”的所有对象。使用“.first()”,您会将给定查询集转换为一个对象(即使查询集中只有一个对象,您也需要这样做)
而不是这个
try:
cart = Cart.objects.get(cart_id=_cart_id(request))
except Cart.DoesNotExist:
cart = Cart.objects.create(
cart_id = _cart_id(request)
)
cart.save()
推荐阅读
- angular - Angular 材质主题的问题
- laravel - 有没有办法只在更新屏幕上显示信息?
- flutter - maxLengthEnforced 在达到 maxLength 后仍然允许输入
- postgresql - 为什么函数 i PostgreSQL 不会引发异常?
- java - Selma - 自定义字段到字段映射错误
- python - Discord bot 删除错误消息?
- phoenix-framework - Phoenix 中指定的 app.html.eex 布局在哪里?
- python - 从 Wikipedia 页面抓取表格数据
- asp.net-core - asp.net 核心传递模型从控制器更改视图布局查看
- svg - Svelte + 动态 SVG(棋盘用例)