python - 为什么我的 TypeError 说“+ 不支持的操作数类型:‘int’和‘str’
问题描述
我正在运行 Django 并尝试做一个电子商务网站。我正在使用购物车中的总数来获得以下信息:
- 购物车商品总数
- 检索所有购物车项目
- 所有项目的总成本。
我的代码如下
模型.py
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=100, null=True)
def __str__(self):
return str(self.id)
@property
def get_cart_total(self):
orderitems = self.orderitem_set.all()
total = sum([item.get_total for item in orderitems])
return total
@property
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
models.py 中的第 54 行是
total = sum([item.get_total for item in orderitems])
视图.py
def cart(request):
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
else:
# Create empty cart for now for non-logged in user
items = []
order = {'get_cart_total': 0, 'get_cart_items': 0}
context = {'items': items, 'order': order}
return render(request, 'IT6041App/cart.html', context)
购物车.html
{% extends "IT6041App/base.html" %}
{% load static %}
{% block content %}
<br><br><br>
<div class="row justify-content-md-center">
<div class="col-lg-6">
<br>
<div class="box-element">
<div class="cart-row">
<a class="btn btn-outline-dark" href="{% url 'index' %}">Continue Shopping</a>
<div style="flex:1"></div>
<div style="flex:1" align="center"><strong>Item</strong></div>
<div style="flex:1" align="center"><strong>Price</strong></div>
<div style="flex:1" align="center"><strong>Quantity</strong></div>
<div style="flex:1" align="center"><strong>Total</strong></div>
</div>
{% for item in items %}
<div class="cart-row">
<div style="flex:2"><img class="row-image" src="{{ item.product.imageURL }}"></div>
<div style="flex:1" align="center"><p>{{ item.product.product_name }}</p></div>
<div style="flex:1" align="center"><p>{{ item.product.price|floatformat:2 }}</p></div>
<div style="flex:1" align="center">
<p class="quantity">{{ item.quantity }}</p>
<div class="quantity">
<img class="chg-quantity" src="{% static 'media/arrow-up.png' %}">
<img class="chg-quantity" src="{% static 'media/arrow-down.png' %}">
</div>
</div>
<div style="flex:1" align="center"><p>${{ item.get_total|floatformat:2 }}</p></div>
</div>
{% endfor %}
</div>
<br>
<div class="box-element">
<br><br>
<table class="table">
<tr>
<th><h5>Items: <strong>{{ order.get_cart_items }}</strong></h5></th>
<th colspan="2" id="total-cost"><h5>Total:<strong>{{ order.get_cart_total|floatformat:2 }}</strong></h5></th>
<th>
<a style="float:right; margin:5px;" class="btn btn-success" href="{% url 'checkout' %}">Checkout</a>
</th>
</tr>
</table>
</div>
</div>
</div>
<br><br><br>
{% endblock content%}
我的错误是这个
TypeError at /cart/
unsupported operand type(s) for +: 'int' and 'str'
Request Method: GET
Request URL: http://127.0.0.1:8000/cart/
Django Version: 3.0.5
Exception Type: TypeError
Exception Value:
unsupported operand type(s) for +: 'int' and 'str'
Exception Location: C:\Users\mackm\OneDrive\Documents\GitHub\IT6041Web\IT6041App\models.py in get_cart_total, line 54
Python Executable: C:\Users\mackm\PycharmProjects\IT6041-Project\venv\Scripts\python.exe
Python Version: 3.8.5
Python Path:
['C:\\Users\\mackm\\OneDrive\\Documents\\GitHub\\IT6041Web',
'C:\\Users\\mackm\\AppData\\Local\\Programs\\Python\\Python38-32\\python38.zip',
'C:\\Users\\mackm\\AppData\\Local\\Programs\\Python\\Python38-32\\DLLs',
'C:\\Users\\mackm\\AppData\\Local\\Programs\\Python\\Python38-32\\lib',
'C:\\Users\\mackm\\AppData\\Local\\Programs\\Python\\Python38-32',
'C:\\Users\\mackm\\PycharmProjects\\IT6041-Project\\venv',
'C:\\Users\\mackm\\PycharmProjects\\IT6041-Project\\venv\\lib\\site-packages']
Server time: Tue, 10 Nov 2020 10:42:07 +0000
这里完全错误
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/cart/
Django Version: 3.0.5
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'IT6041App.apps.IT6041appConfig',
'users.apps.UsersConfig',
'crispy_forms']
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']
Template error:
In template C:\Users\mackm\OneDrive\Documents\GitHub\IT6041Web\IT6041App\templates\IT6041App\base.html, error at line 0
unsupported operand type(s) for +: 'int' and 'str'
1 : {% load static %}
2 :
3 : <!doctype html>
4 : <html lang="en">
5 : <head>
6 : <meta charset="utf-8">
7 : <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
8 : <meta name="description" content="">
9 : <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
10 : <meta name="generator" content="Jekyll v4.1.1">
Traceback (most recent call last):
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 828, in _resolve_lookup
current = current[bit]
During handling of the above exception ('Order' object is not subscriptable), another exception occurred:
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\mackm\OneDrive\Documents\GitHub\IT6041Web\IT6041App\views.py", line 22, in cart
return render(request, 'IT6041App/cart.html', context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\shortcuts.py", line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\loader.py", line 62, in render_to_string
return template.render(context, request)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 171, in render
return self._render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 986, in render
output = self.filter_expression.resolve(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 670, in resolve
obj = self.var.resolve(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 795, in resolve
value = self._resolve_lookup(context)
File "C:\Users\mackm\PycharmProjects\IT6041-Project\venv\lib\site-packages\django\template\base.py", line 836, in _resolve_lookup
current = getattr(current, bit)
File "C:\Users\mackm\OneDrive\Documents\GitHub\IT6041Web\IT6041App\models.py", line 54, in get_cart_total
total = sum([item.get_total for item in orderitems])
Exception Type: TypeError at /cart/
Exception Value: unsupported operand type(s) for +: 'int' and 'str'
我的 base.html 文件有问题吗?
我希望有人可以在这里帮助我。
先感谢您
orderItems 类
class OrderItem(models.Model):
product = models.ForeignKey(Products, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
@property
def get_total(self):
total = self.product.price * self.quantity
return total
解决方案
在将总数传递给 Order 类进行渲染之前,我必须将总数更改为浮点数。这现在工作得很好。
class OrderItem(models.Model):
product = models.ForeignKey(Products, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
@property
def get_total(self):
total = fload(self.product.price) * float(self.quantity)
return total
推荐阅读
- python - 如何在使用construct_mapping和add_constructor时有效地从YAML获取字符串对象而不是Unicode?
- sequelize.js - 在sequelize上执行sql查询
- javascript - Mobx 和 React 异步函数调用会冻结 UI,而 onClick 调用不会
- c++ - 使用内核驱动程序c ++写入只读地址
- c# - StringBuilder AppendLine 方法未将换行符添加到 HTML 输出
- c++ - c++ 中的 unordered_set 中是否存在任何顺序?
- amazon-redshift - 需要在 LAG 函数中包含偏移值作为 expr
- javascript - 有没有办法使用 highcharts 更改系列显示值
- sql - 在给定开放和关闭日期的情况下,随时间生成开放票的计数
- c++ - Boost::asio 到 Struct(如 recv)