0
0 комментариев

Python 3.7; Windows 10

Мой первый интернет-магазин и я нуждаюсь в помощи, так как недостаточно опыта для решения такой проблемы.

Должны отправляться данные о заказе на почту менеджера сайта в таком формате:

«Дата;Пользователь;Номенклатура;Сумма заказа;Способ получения;Адрес;Комментарий к заказу».

Но письмо приходит пустое(без нужных данных) и ошибки не возникают.

Проблема встала недавно. До этого все успешно отправлялось и работало. Посмотрите код, помогите исправить, пожалуйста.

Заранее благодарю за любую помощь!

Модель корзины:

class CartItem(models.Model):
          product = models.ForeignKey(Product, on_delete=models.PROTECT, verbose_name = 'Товар')
     quantity = models.PositiveIntegerField(default=1, verbose_name = 'Кількість')
     item_total = models.DecimalField(max_digits=9, decimal_places=2, default=0.00, verbose_name = 'Сума корзини')
       def __str__(self):
         return  "Cart item for product {0}".format(self.product.title)
      class Meta():
        verbose_name_plural = 'Вміст корзини'
        verbose_name = 'Вміст корзини'
  class Cart(models.Model):
     items = models.ManyToManyField(CartItem, blank=True, verbose_name = 'Складова')
    cart_total = models.DecimalField(max_digits=9, decimal_places=2, default=0.00, verbose_name = 'Сума корзини')
    coupon = models.ForeignKey(Coupon, on_delete=models.PROTECT,blank=True,null = True, verbose_name = 'Купон', default = None)
         def __str__(self):
        return str(self.id)
      def add_to_cart(self, product_slug):
        cart = self
        product = Product.objects.get(slug=product_slug)
        current_price = Cart.getActualPrice(product)
        is_present = False
        for item in cart.items.all():
            if item.product.slug == product_slug:
                is_present = True
                cart = self
         if not is_present:
            new_item, _ = CartItem.objects.get_or_create(product=product, item_total=current_price)   
            cart.items.add(new_item)
            cart.save()
              @property
    def actual_total(self):
        if self.coupon.type == 'monetary':
            if cart_total >= self.coupon.value :
                return cart_total - self.coupon.value
            else:
                return cart_total
            #
         if self.coupon.type == 'відсотковий':
            return self.cart_total
            #
      def set_coupon(self, _coupon):
        self.coupon = _coupon
         if not self.coupon:
            return
        if self.items.count() == 0:
            return
        print(self.coupon.type)
        if self.coupon.type == 'відсотковий':
            item_maxprice = 0.00
            for cart_item in self.items.all():
                current_price = Cart.getActualPrice(cart_item.product)
                if current_price > item_maxprice:
                    item_maxprice = current_price
            cart_discount = item_maxprice * int(self.coupon.value) / 100
            cheaperItem = self.items.first()
            for cart_item in self.items.all():
                if Cart.getActualPrice(cart_item.product) < Cart.getActualPrice(cheaperItem.product):
                    cheaperItem = cart_item
            self.change_quantity(cheaperItem.quantity, cheaperItem.id, cart_discount)
            self.save()
            #
                 def remove_from_cart(self, product_slug):
        cart = self
        product = Product.objects.get(slug=product_slug)
        for cart_item in cart.items.all():
           if cart_item.product == product:
                cart.items.remove(cart_item)
                cart.save() 
                      def getActualPrice(product):
        if product.promoteprice != 0.00:
            return product.promoteprice
        else:
            return product.price
             def change_quantity(self, quantity, item_id, cart_discount = 0):
        cart = self
                 cart_item = CartItem.objects.get(id=int(item_id))
        if quantity == 1:
            quantity = cart_item.quantity
        current_price = Cart.getActualPrice(cart_item.product)
        item_diff = 0
        if cart_discount > 0:
            if current_price < cart_discount:
                item_diff = current_price
            else:
                item_diff = cart_discount
        cart_item.quantity = int(quantity)
        cart_item.item_total = (int(quantity) * Decimal(current_price)) - item_diff
        cart_item.save()
        new_cart_total = 0.00
        for item in cart.items.all():
            new_cart_total += float(item.item_total)
        cart.cart_total = new_cart_total
        cart.save()  
             class Meta():
        verbose_name_plural = 'Корзини'
        verbose_name = 'Корзина'

Контроллер корзины:

def cart_view(request):
     cform = CouponForm(None)
    if request.method == 'GET' and len(request.GET) > 0:
        cform = CouponForm(request.GET)
             try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart.id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)
    context = {
        'cart':cart,
        'coupon':cform
        }
     for item in cart.items.all():
        cart.change_quantity(item.quantity, item.id)
    cart.set_coupon(cart.coupon)
    return render(request, 'cart.html', context)
  def add_to_cart_view(request):
    try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart.id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)
    product_slug = request.GET.get('product_slug')
    product = Product.objects.get(slug=product_slug)
    cart.add_to_cart(product.slug)
    new_cart_total = 0.00
    for item in cart.items.all():
        new_cart_total += float(item.item_total)
    cart.cart_total = new_cart_total
    cart.save()
    return JsonResponse({'cart_total': cart.items.count(), 'cart_total_price': cart.cart_total})
  def remove_from_cart_view(request):
    try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart.id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)
    product_slug = request.GET.get('product_slug')
    product = Product.objects.get(slug=product_slug)   
    cart.remove_from_cart(product_slug)
    new_cart_total = 0.00
    for item in cart.items.all():
        new_cart_total += float(item.item_total)
    cart.cart_total = new_cart_total
    for item in cart.items.all():
        cart.change_quantity(item.quantity, item.id)
    cart.set_coupon(cart.coupon)
    cart.save()
    return JsonResponse({'cart_total': cart.items.count(), 'cart_total_price': cart.cart_total})

Модель заказа:

ORDER_STATUS_CHOICES = ('Замовлення передано нашому менеджеру', 'Замовлення передано нашому менеджеру'),('Виконується', 'Виконується')
 class Order(models.Model):
     user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, verbose_name = 'Користувач')
    items = models.ManyToManyField(Cart)
    total = models.DecimalField(max_digits = 9, decimal_places=2, default=0.00, verbose_name = 'Сума замовлення')
    first_name = models.CharField(max_length=150, verbose_name = 'Імя користувача')
    last_name = models.CharField(max_length=150, verbose_name = 'Прізвище користувача')
    phone = models.CharField(max_length=15, verbose_name = 'Телефон користувача')
    email = models.EmailField(verbose_name = 'Електронна пошта користувача', blank = True)
    address = models.CharField(max_length=200, verbose_name = 'Адреса доставки', blank = True)
    buying_type = models.CharField(max_length=50, choices =(('Самовивіз з магазину','Самовивіз з магазину'), ('Доставка за адресою','Доставка за адресою')), default='Самовивіз з магазину', verbose_name = 'Тип замовлення')
    date = models.DateTimeField(auto_now_add=True, verbose_name = 'Бажана дата доставки')
    comments = models.TextField(verbose_name = 'Коментар до замовлення', blank = True)
    status = models.CharField(max_length=100, choices=ORDER_STATUS_CHOICES, default=ORDER_STATUS_CHOICES[0][0], verbose_name = 'Статус замовлення')
     def __str__ (self):
        return "Замовлення №{0}".format(str(self.id))
     class Meta():
        verbose_name_plural = 'Замовлення'
        verbose_name = 'Замовлення'

Контроллер заказа:

def make_order_view(request):
    try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart.id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)
    form = OrderForm(request.POST or None)	   
    categories = Category.objects.all()
    if form.is_valid():
        first_name = form.cleaned_data['first_name']
        last_name = form.cleaned_data['last_name']
        phone = form.cleaned_data['phone']
        buying_type = form.cleaned_data['buying_type']
        address = form.cleaned_data['address']
        comments = form.cleaned_data['comments']
        new_order = Order.objects.create(
            user=request.user,
            total=cart.cart_total,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
            address=address,
            buying_type=buying_type,
            comments=comments
            )
        new_order.items.add(cart)
         if cart.coupon:
            cart.coupon.redeem(request.user)
        context = {'admin': 'Шевчук Марія'}
        s = render_to_string('checkout_email.txt', context)
        em = EmailMessage(subject='Нове замовлення', body=s, to=[ 'www.senryshikki@gmail.com'] )
        em.send() 
        del request.session['cart_id']
        del request.session['total']
        return HttpResponseRedirect(reverse('thank_you'))
    return render(request, 'checkout.html',  {'categories': categories})

Template для отправки сообщения на почту:

{% load i18n %}{% blocktrans %}Шановний, менеджер, на Дніпромич нове замовлення!{% endblocktrans %}
 Дата: {{ order.date }}
 Користувач: {{ order.first_name }} {{ order.last_name }}
  {% for cart in order.items.all %}
   {% for item in cart.items.all %}
    Номенклатура: {{ item.product.title }} - {{ item.quantity }} шт. Ціна (за одиницю): {{ item.item_total }} грн.
   {% endfor %}
   Сума замовлення: {{ cart.cart_total }} грн.
  {% endfor %}
 Спосіб отримання: {{ order.buying_type }}
 Адреса: {{ order.address }}
 Коментар до замовлення: {{ order.comments }}


Добавить комментарий