Объект Int не является вызываемым в коде ${{order.get_cart_total}}.
У меня в модели следующий код, при вызове get_cart_total int not callable or unsupported operand type(s) for +: 'int' and 'method'appaers
Я ожидаю получить общую сумму из get_cart_total
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False, null=True, blank=False)
transaction_id = models.CharField(max_length=200, null=True)
def __str__(self):
return str(self.id)
@property
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
@property
def get_cart_total(self):
items = self.get_cart_items()
for item in items:
total += item.get_total()
return total
class OrderItem(models.Model):
ORDER_ITEM_TYPE = (
('type1', 'Collection1'),
('type2', 'Collection2'),
)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
collection_type = models.CharField(max_length=255, choices=ORDER_ITEM_TYPE)
collection1 = models.ForeignKey(Collection1, on_delete=models.SET_NULL, null=True, blank=True)
collection2 = models.ForeignKey(Collection2, on_delete=models.SET_NULL, null=True, blank=True)
quantity = models.IntegerField()
def get_total(self):
if self.collection_type == "type1":
return self.collection1.price * self.quantity
elif self.collection_type == "type2":
return self.collection2.price * self.quantity
Поскольку self.get_cart_items
является свойством, вызывать его не нужно. Вы можете либо удалить декоратор @property
, либо просто ожидать, что self.get_cart_items
будет уже целым числом, а не методом.
@property
def get_cart_total(self):
- items = self.get_cart_items()
+ items = self.get_cart_items
for item in items:
total += item.get_total()
return total
Вы задали get_cart_items
как property
, который рассматривается как атрибут объекта, а не как метод. Вам нужно удалить этот декоратор или ()
из ваших вычислений.
Вариант 1:
@property
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
@property
def get_cart_total(self):
items = self.get_cart_items
for item in items:
total += item.get_total()
return total
Вариант 2:
def get_cart_items(self):
orderitems = self.orderitem_set.all()
total = sum([item.quantity for item in orderitems])
return total
@property
def get_cart_total(self):
items = self.get_cart_items()
for item in items:
total += item.get_total()
return total
- Ваш
get_cart_items
является методом свойства, который не является вызываемым, поэтому удалите()
, когда вы хотите использовать этот метод .
get_cart_items()
возвращает значение int, которое является суммой количеств элементов, поэтому здесь в вашем кодеitems = self.get_cart_items()
вы не можете циклически перебирать целочисленные значения .
Исправьте свой код соответствующим образом
@property
def get_cart_items(self):
return self.orderitem_set.all()
@property
def get_cart_total(self):
items = self.get_cart_items
for item in items:
total += item.get_total()
return total
Пара точек:
- 'get_cart_items' является свойством (декоратор @property), поэтому вы должны обращаться с ним как с таковым. Изменить:
items = self.get_cart_items()
наitems = self.get_cart_items
, или удалите декоратор @property. - 'get_cart_items' возвращает не список объектов OrderItem, а сумму количества товаров (целое число) .
- Переменная 'total' не инициализируется в методе 'get_cart_total'.
Попробуйте что-нибудь вроде этого для метода 'get_cart_total':
def get_cart_total(self):
total = 0
for item in self.orderitem_set.all():
total += item.get_total()
return total