def checkout(request, template_name="shop/checkout.html"): cart = get_shopping_cart(request) if cart.items_count() == 0: return redirect('shop_cart') customer = get_customer(request) c_form = CustomerForm(prefix='customer', instance=customer) s_form = AddressForm(prefix='shipping', instance=getattr(customer, 'shipping_address', None)) b_form = AddressForm(prefix='billing', instance=getattr(customer, 'billing_address', None)) if request.method == 'POST': c_form = CustomerForm(request.POST, prefix='customer', instance=customer) commit = True if c_form.is_valid(): customer = c_form.save(commit=False) s_form = AddressForm(request.POST, prefix='shipping', instance=customer.shipping_address) if s_form.is_valid(): customer.shipping_address = s_form.save(commit=False) if customer.same_address: customer.billing_address = customer.shipping_address else: b_form = AddressForm(request.POST, prefix='billing', instance=customer.billing_address) if b_form.is_valid(): customer.billing_address = b_form.save(commit=False) else: commit = False else: commit = False if commit: customer.save() if not cart.customer: cart.customer = customer cart.status = STATUS_CONFIRMED cart.save() return redirect('shop_confirmation') return render_to_response(template_name, { 'cart': cart, 'customerform': c_form, 'shippingform': s_form, 'billingform': b_form, }, context_instance=RequestContext(request))