invoice = create_invoice(order, email)
if invoice and invoice.send():
return invoice.id
return None
def create_order(user, shipping_address, cart_items):
logger.debug("Creating order for user: %s", user)
order = Order.objects.create(
user=user,
shipping_address=shipping_address,
order_date=timezone.now(),
total_cost=sum(item.size.price * item.quantity for item in cart_items)
)
for item in cart_items:
size = get_object_or_404(ProductSize, id=item.size_id)
order_item = OrderItem.objects.create(
order=order,
product=item.product,
size=size,
quantity=item.quantity
)
order.items.add(order_item)
logger.info("Order created: %s", order.id)
return order
@login_required
def logged_in_checkout_view(request):
logger.debug("Logged-in user attempting to check out")
if request.method == 'POST':
form = CheckoutForm(request.POST)
address_form = DeliveryAddressForm(request.POST)
logger.debug("CheckoutForm and DeliveryAddressForm received")
if form.is_valid() and address_form.is_valid():
logger.debug("Forms are valid")
shipping_address = address_form.save(commit=False)
shipping_address.user = request.user
shipping_address.save()
logger.debug("Shipping address saved")
cart_items = Cart.objects.filter(user=request.user)
if not cart_items.exists():
logger.error("No cart items found for user")
return redirect('cart:cart')
order = create_order(request.user, shipping_address, cart_items)
logger.info(f"Order created: {order.id}")
invoice_id = create_invoice_view(request, order, request.user.email)
if invoice_id:
logger.info(f"Invoice ID: {invoice_id}")
order.ref_code = invoice_id
order.save()
else:
logger.error("Invoice creation failed")
cart_items.delete()
request.session['order_id'] = str(order.id)
request.session['total_price'] = str(order.total_cost())
return redirect('cart:payment_done')
else:
logger.error("Form validation failed")
if not form.is_valid():
logger.error("CheckoutForm errors: %s", form.errors)
if not address_form.is_valid():
logger.error("DeliveryAddressForm errors: %s", address_form.errors)
else:
form = CheckoutForm()
address_form = DeliveryAddressForm()
cart_items = Cart.objects.filter(user=request.user)
total_price = sum(item.size.price * item.quantity for item in cart_items)
logger.debug("Displaying checkout form")
return render(request, 'cart/checkout.html', {
'form': form,
'address_form': address_form,
'total_price': total_price,
'PAYPAL_CLIENT_ID': settings.PAYPAL_CLIENT_ID,
'user': request.user
})```
#Django ecommerce create_order() doesnt work!
5 messages · Page 1 of 1 (latest)
Tried Debugging it with a logger.
it seems like the create_order function never gets called or gets pass. I was thinking it might be the form affecting it
from django import forms
from .models import DeliveryAddress
from user.models import Order
class CheckoutForm(forms.Form):
first_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
last_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
use_default_shipping = forms.BooleanField(required=False, widget=forms.CheckboxInput())
use_default_billing = forms.BooleanField(required=False, widget=forms.CheckboxInput())
same_billing_address = forms.BooleanField(required=False, widget=forms.CheckboxInput())
class GuestCheckoutForm(forms.Form):
first_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
last_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
use_default_shipping = forms.BooleanField(required=False, widget=forms.CheckboxInput())
use_default_billing = forms.BooleanField(required=False, widget=forms.CheckboxInput())
same_billing_address = forms.BooleanField(required=False, widget=forms.CheckboxInput())
class DeliveryAddressForm(forms.ModelForm):
class Meta:
model = DeliveryAddress
fields = ['address_line1', 'address_line2', 'city', 'state', 'postal_code', 'country', 'phone_number']
widgets = {
'address_line1': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Street address, P.O. box, company name, c/o'}),
'address_line2': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Apartment, suite, unit, building, floor, etc.'}),
'city': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'City'}),
'state': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'State / Province / Region'}),
'postal_code': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'ZIP / Postal Code'}),
'country': forms.Select(attrs={'class': 'form-control'}, choices=[
('US', 'United States'),
('GB', 'United Kingdom'),
# Add other countries as needed
]),
'phone_number': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Phone Number'}),
}
class OrderStatusForm(forms.ModelForm):
class Meta:
model = Order
fields = ['status']
this is my Models.py for the Order
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
class CustomUser(AbstractUser):
email = models.EmailField(unique=True)
def __str__(self):
return self.username
class UserProfile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='profile')
bio = models.TextField(blank=True)
shipping_address = models.TextField(blank=True, null=True)
def __str__(self):
return f"{self.user.username}'s Profile"
class Order(models.Model):
STATUS_CHOICES = [
('PENDING', 'Pending'),
('SHIPPED', 'Shipped'),
('DELIVERED', 'Delivered'),
('CANCELLED', 'Cancelled'),
]
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='orders', null=True, blank=True)
guest_email = models.EmailField(null=True, blank=True)
order_date = models.DateTimeField(default=timezone.now)
ordered_date = models.DateTimeField(default=timezone.now) # Added ordered_date field
shipping_address = models.TextField()
paypal_invoice_id = models.CharField(max_length=255, blank=True, null=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='PENDING')
def __str__(self):
return f"Order {self.id} by {self.user.username if self.user else self.guest_email}"
def total_cost(self):
return sum(item.total_cost() for item in self.items.all())
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey('products.Products', on_delete=models.CASCADE)
size = models.ForeignKey('products.ProductSize', on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
def __str__(self):
return f"{self.quantity} of {self.product.title} - {self.size.size}"
def total_cost(self):
return self.size.price * self.quantity
Django ecommerce create_order() doesnt work!