Не трогал проект неделю, до этого все работало, потом переустановил pycharm запустил проект и вот тут это
При нажатии кнопки купить вылетает ошибка:
Request Method: GET
Request URL:
127.0.0.1:8000/basket_adding/?csrfmiddlewaretoken=...
Django Version: 1.11.7
Exception Type: AttributeError
Exception Value:
'NoneType' object has no attribute 'price'
Exception Location: C:\Python362\Environments\Internet-ploshadka\Platform\orders\models.py in save, line 107
Python Executable: C:\Python362\python.exe
Python Version: 3.6.2
Python Path:
['C:\\Python362\\Environments\\Internet-ploshadka\\Platform',
'C:\\Python362\\python36.zip',
'C:\\Python362\\DLLs',
'C:\\Python362\\lib',
'C:\\Python362',
'C:\\Python362\\lib\\site-packages']
orders/models.py
from django.db import models
from products.models import Product
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from utils.main import disable_for_loaddata
class Status(models.Model):
name = models.CharField(max_length=24, blank=True, default=None)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return "Статус: %s" % self.name
class Meta:
verbose_name = 'Статус'
verbose_name_plural = 'Статусы заказов'
class Order(models.Model):
user = models.ForeignKey(User, blank=True, null=True, default=None)
total_price = models.DecimalField(max_digits=10, decimal_places=2,
default=0) # total price for all products in order
customer_name = models.CharField(max_length=64, blank=True, null=True, default=None)
customer_email = models.EmailField(blank=True, null=True, default=None)
customer_phone = models.CharField(max_length=48, blank=True, null=True, default=None)
customer_address = models.CharField(max_length=128, blank=True, null=True, default=None)
comments = models.TextField(blank=True, null=True, default=None)
status = models.ForeignKey(Status)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return " %s %s" % (self.id, self.status.name)
class Meta:
verbose_name = 'Заказ'
verbose_name_plural = 'Заказы'
def save(self, *args, **kwargs):
super(Order, self).save(*args, **kwargs)
class ProductInOrder(models.Model):
order = models.ForeignKey(Order, blank=True, null=True, default=None)
product = models.ForeignKey(Product, blank=True, null=True, default=None)
nmb = models.IntegerField(default=1)
price_per_item = models.DecimalField(max_digits=10, decimal_places=2, default=0)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) # price*nmb
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return " %s" % self.product.name
class Meta:
verbose_name = 'Товар в заказе'
verbose_name_plural = 'Товары в заказе'
def save(self, *args, **kwargs):
price_per_item = self.product.price
self.price_per_item = price_per_item
print(self.nmb)
self.total_price = int(self.nmb) * self.price_per_item
super(ProductInOrder, self).save(*args, **kwargs)
@disable_for_loaddata
def product_in_order_post_save(sender, instance, created, **kwargs):
order = instance.order
all_products_in_order = ProductInOrder.objects.filter(order=order, is_active=True)
order_total_price = 0
for item in all_products_in_order:
order_total_price += item.total_price
instance.order.total_price = order_total_price
instance.order.save(force_update=True)
post_save.connect(product_in_order_post_save, sender=ProductInOrder)
class ProductInBasket(models.Model):
session_key = models.CharField(max_length=128, blank=True, null=True, default=None)
order = models.ForeignKey(Order, blank=True, null=True, default=None)
product = models.ForeignKey(Product, blank=True, null=True, default=None)
nmb = models.IntegerField(default=1)
price_per_item = models.DecimalField(max_digits=10, decimal_places=2, default=0)
total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0) # price*nmb
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
def __str__(self):
return " %s" % self.product.name
class Meta:
verbose_name = 'Товар в корзине'
verbose_name_plural = 'Товары в корзине'
def save(self, *args, **kwargs):
price_per_item = self.product.price
self.price_per_item = price_per_item
self.total_price = int(self.nmb) * self.price_per_item
super(ProductInBasket, self).save(*args, **kwargs)
orders/views.py:
from django.http import JsonResponse, HttpResponse, HttpResponseRedirect
from .models import *
from django.shortcuts import render
from .forms import CheckoutContactForm
from django.contrib.auth.models import User
def basket_adding(request):
return_dict = dict()
session_key = request.session.session_key
print(request.POST)
data = request.POST
product_id = data.get("product_id")
nmb = data.get("nmb")
is_delete = data.get("is_delete")
if is_delete == 'true':
ProductInBasket.objects.filter(id=product_id).update(is_active=False)
else:
new_product, created = ProductInBasket.objects.get_or_create(session_key=session_key, product_id=product_id, is_active=True, defaults={"nmb": nmb})
if not created:
print("not created")
new_product.nmb += int(nmb)
new_product.save(force_update=True)
# common code for 2 cases
products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True, order__isnull=True)
products_total_nmb = products_in_basket.count()
return_dict["products_total_nmb"] = products_total_nmb
return_dict["products"] = list()
for item in products_in_basket:
product_dict = dict()
product_dict["id"] = item.id
product_dict["name"] = item.product.name
product_dict["price_per_item"] = item.price_per_item
product_dict["nmb"] = item.nmb
return_dict["products"].append(product_dict)
return JsonResponse(return_dict)
def checkout(request):
session_key = request.session.session_key
products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True, order__isnull=True)
print (products_in_basket)
for item in products_in_basket:
print(item.order)
form = CheckoutContactForm(request.POST or None)
if request.POST:
print(request.POST)
if form.is_valid():
print("yes")
data = request.POST
name = data.get("name", "3423453")
phone = data["phone"]
user, created = User.objects.get_or_create(username=phone, defaults={"first_name": name})
order = Order.objects.create(user=user, customer_name=name, customer_phone=phone, status_id=1)
for name, value in data.items():
if name.startswith("product_in_basket_"):
product_in_basket_id = name.split("product_in_basket_")[1]
product_in_basket = ProductInBasket.objects.get(id=product_in_basket_id)
print(type(value))
product_in_basket.nmb = value
product_in_basket.order = order
product_in_basket.save(force_update=True)
ProductInOrder.objects.create(product=product_in_basket.product, nmb = product_in_basket.nmb,
price_per_item=product_in_basket.price_per_item,
total_price = product_in_basket.total_price,
order=order)
return HttpResponseRedirect(request.META['HTTP_REFERER'])
else:
print("no")
return render(request, 'checkout/checkout.html', locals())
форма на html странице:
<div class="col-vo">
<form id="form_buying_product" class="form-inline"
action="{% url 'basket_adding' %}">{% csrf_token %}
<div class="form-group">
<input type="number" class="form-control" name="number" id="number"
placeholder="Введите колличество...">
</div>
<div class="form-group">
<button type="submit" id="submit_btn" class="add-to item_add hvr-skew-backward"
data-product_id="{{ product_id }}"
data-name="{{ product.name }}"
data-price="{{ product.price }}"
>
Купить
</button>
</div>
</form>
</div>