当购物车结帐时,需要将订单保存到数据库中。订单将包含有关客户和他们正在购买的产品的信息。
使用以下命令创建一个用于管理客户订单的新应用程序:
INSTALLED_APPS = [
#...
"orders.apps.OrdersConfig",
]
from django.db import models
from shop.models import Product
class Order(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.EmailField()
address = models.CharField(max_length=250)
postal_code = models.CharField(max_length=20)
city = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
paid = models.BooleanField(default=False)
class Meta:
ordering = ('-created',)
def __str__(self):
return 'Order {}'.format(self.id)
def get_total_cost(self):
return sum(item.get_cost() for item in self.items.all())
class OrderItem(models.Model):
order = models.ForeignKey(Order,related_name='items',on_delete=models.CASCADE)
product = models.ForeignKey(Product,related_name='order_items',on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10,decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
def __str__(self):
return '{}'.format(self.id)
def get_cost(self):
return self.price * self.quantity
运行下一个命令为orders应用程序创建初始迁移:
from django.contrib import admin
from .models import Order,OrderItem
class OrderItemInline(admin.TabularInline):
model = OrderItem
raw_id_fields = ['product']
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ['id','first_name','last_name','email','address','postal_code','city','paid','created','updated']
list_filter = ['paid','created','updated']
inlines = [OrderItemInline]
OrderItem模型使用一个ModelInline类,将其作为内联类包含在OrderAdmin类。内联允许在与其相关的模型相同的编辑页面上包含模型。
当用户最终下订单时,将使用创建的订单模型来持久化购物车中包含的商品。按照以下步骤创建一个新订单:
1. 向用户提供一个订单表单,以便填写他们的数据
2. 使用输入的数据创建一个新的Order实例,并创建一个关联的
购物车中每个项目的OrderItem实例
3. 清除所有购物车内容并将用户重定向到成功页面
在orders应用程序目录中创建一个新文件,并将其命名为forms.py。将以下代码添加到其中:
from django import forms
from .models import Order
class OrderCreateForm(forms.ModelForm):
class Meta:
model = Order
fields = ['first_name','last_name','email','address','postal_code','city']
这是用于创建新Order对象的表单。还需要一个视图来处理表单并创建一个新订单。
编辑orders应用程序的views.py文件,并向其中添加以下代码:
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(
order=order,
product = item['product'],
price=item['price'],
quantity=item['quantity'],
)
cart.clear()
return render(request,'orders/order/created.html',{'order':order})
else:
form = OrderCreateForm()
return render(request,'orders/order/create.html',{'cart':cart,'form':form})
在order_create视图中,我们将使用cart 从session中获取当前购物车(请求)。根据不同的请求方法,将执行以下任务:
关于购物车cart的设计实现,请查看Django使用session管理购物车-CSDN博客
在orders应用程序目录中创建一个新文件,并将其命名为urls.py。将以下代码添加到其中:
from django.urls import path
from . import views
app_name = 'orders'
urlpatterns = [
path('create/',views.order_create, name='order_create')
]
这是order_create视图的URL模式。编辑mysite的urls.py文件,并包含以下模式。记得把它放在shop.urls前面
urlpatterns = [
path('orders/', include('orders.urls', namespace='orders')),
path("shop/",include('shop.urls',namespace='shop')),
path("cart/",include('cart.urls',namespace='cart')),
]
编辑cart应用程序的cart/detail.html模板并编辑这一行:
用户现在可以从购物车详细信息页面导航到订单表单。
在orders应用程序目录中创建以下文件结构:
templates/orders/order/create.html
templates/orders/order/created.html
编辑orders/order/create.html模板,并包含以下代码:
{% extends "shop/base.html" %}
{% load widget_tweaks %}
{% block title %}
Checkout
{% endblock %}
{% block content %}
Checkout
Your order
{% for item in cart %}
{{ item.quantity }}x {{ item.product.name }}
${{ item.total_price }}
{% endfor %}
Total: ${{ cart.get_total_price }}
{% endblock %}
此模板显示购物车(包括总数)和用于下订单的表单。
编辑orders/order/created.html模板,并添加以下代码:
{% extends "shop/base.html" %}
{% block title %}
Thank you
{% endblock %}
{% block content %}
Thank you
Your order has been successfully completed. Your order number is
{{ order.id }}.
{% endblock %}
这是在成功创建订单后呈现的模板。
用有效的数据填写表单,然后单击Place order按钮。订单将被创建,您将看到如下所示的成功页面: