简体   繁体   中英

Why is my TypeError saying 'unsupported operand type(s) for +: 'int' and 'str'

I'm running Django and trying to do an e-commerce site. I'm working with totals in my cart to get the following:

  1. Total number of cart items
  2. Retrieve all cart items
  3. Total cost of all items.

my code is as follows

models.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

line 54 in models.py is

total = sum([item.get_total for item in orderitems])

views.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)

cart.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%}

my error is this

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

full error here

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'

Is there something wrong with my base.html file?

I hope someone can help me here.

Thank you in advance

orderItems class

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

I had to change my total to a float before passing it to the Order class for rendering. this works just fine now.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM