说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :Django项目之Web端电商网站的实战开发(五)_cdtaogang's blog-CSDN博客
非VIP用户请点击这里进行查阅
目录
一丶订单生成
二丶订单支付
三丶订单评论
四丶项目部署
五丶项目总结
一丶订单生成1.显示订单提交页面
step1 在df_order/views中定义类视图post方法,显示订单提交页面class OrderPlaceView(LoginRequiredMixin, View):
"""提交订单"""
def post(self, request):
"""显示提交订单页面"""
return render(request, 'place_order.html')
step2 在df_order/urls中定义路由规则url(r"^place$", OrderPlaceView.as_view(), name='place'), # 显示订单页 step3 在place_order.html模板文件中,设置复选框checkbox的name为sku_ids以及value值为sku.id也就是商品id,因为当进行表单提交时,复选框的状态为未勾选状态时,则在headers from data表单数据中不会显示该商品的value值,即可以利用该点再后端获取提交订单页面中所有的数据
<form method="post" action="/order/place">
<li class="col01"><input type="checkbox" name="sku_ids" value="{
{ sku.id }}" checked></li>
<li class="col04"><input type="submit" value="去结算"></li>
</form>
2.获取提交订单页面中的数据
step1 判断用户是否登录状态,如果没有登录则跳转到登录页面user = request.user
if not user.is_authenticated():
return redirect(reverse('user:login'))
step2 获取表单中的sku_ids数据并进行校验sku_ids = request.POST.getlist("sku_ids")
if not sku_ids:
return redirect(reverse('cart:cart_show'))
step3 获取redis连接对象,通过遍历sku_ids获取商品的信息,并获取数据库中商品的数量,计算出商品的小计,总计和总件数conn = get_redis_connection("default")
cart_key = "cart_%d" % user.id
skus = []
total_price = 0
total_count = 0
for sku_id in sku_ids:
sku = GoodsSKU.objects.get(id=sku_id)
count = conn.hget(cart_key, sku_id)
amount = sku.price*int(count)
sku.count = count
sku.amount = amount
skus.append(sku)
total_count += int(count)
total_price += amount
step4 设定运费金额,计算订单总金额组织模板上下文,返回给前端模板中transit_price = 10
total_pay = total_price + transit_price
addrs = Address.objects.filter(user=user)
context = {
'skus':skus,'total_count':total_count,
'total_price':total_price, 'transit_price':transit_price,
'total_pay':total_pay, 'addrs':addrs
}
return render(request, 'place_order.html', context)
step5 在模板文件place_order.html中进行数据填坑<div class="common_list_con clearfix">
<dl>
<dt>寄送到:</dt>
{% for addr in addrs %}
<dd><input type="radio" name="" checked="">{
{ addr.addr }} ({
{ addr.receiver }} 收) {
{ addr.phone }}</dd>
{% endfor %}
</dl>
<a href="{% url 'user:address' %}" class="edit_site">编辑收货地址</a>
</div>
{% for sku in skus %}
<ul class="goods_list_td clearfix">
<li class="col01">{
{ forloop.counter }}</li>
<li class="col02"><img src="{
{ sku.image.url }}"></li>
<li class="col03">{
{ sku.name }}</li>
<li class="col04">{
{ sku.unite }}</li>
<li class="col05">{
{ sku.price }}元</li>
<li class="col06">{
{ sku.count }}</li>
<li class="col07">{
{ sku.amount }}元</li>
</ul>
{% endfor %}
<div class="settle_con">
<div class="total_goods_count">共<em>{
{ total_count }}</em>件商品,总金额<b>{
{ total_price }}元</b></div>
<div class="transit">运费:<b>{
{ transit_price }}元</b></div>
<div class="total_pay">实付款:<b>{
{ total_pay }}元</b></div>
</div>
step6 测试点击去结算按钮<dd><input type="radio" name="addr_id" value="{
{ addr.id }}" {% if addr.is_default %}checked{% endif %}>{
{ addr.addr }} ({
{ addr.receiver }} 收) {
{ addr.phone }}</dd>
step8 刷新页面3.创建订单
step1 在提交订单页面,点击提交订单按钮,需要向后端传递提交订单页面中的收获地址和支付方式以及商品的id,即在place_order.html模板文件中需要手动去添加支付方式的value值对应后端订单模型类中的df_order_info表,收获地址前面已经进行设置了,所以不需要设置<input type="radio" name="pay_style" value="1" checked>
<label class="cash">货到付款</label>
<input type="radio" name="pay_style" value="2">
<label class="weixin">微信支付</label>
<input type="radio" name="pay_style" value="3">
<label class="zhifubao"></label>
<input type="radio" name="pay_style" value="4">
<label class="bank">银行卡支付</label>
step2 收货地址和支付方式已经在前端模板中设置好了,最后需要设置的就是商品的id,需要在后端中进行组织好传递到前端模板文件的数据格式,提交订单页面中的商品id已经保存到厚度那中skus列表中了,现在将该列表保存的商品id以逗号进行拼接,传递到前端模板中sku_ids = ','.join(sku_ids)
context = {
'skus':skus,'total_count':total_count,
'total_price':total_price, 'transit_price':transit_price,
'total_pay':total_pay, 'addrs':addrs,
'sku_ids':sku_ids
}
step3 在前端模板中提交订单按钮中,定义标签属性sku_ids<a href="javascript:;" sku_ids={
{ sku_ids }} id="order_btn">提交订单</a>
step4 在place_order.html模板文件中进行提交订单js代码编写,获取用户选择的收货地址,支付方式以及购买的商品id,并通过ajax post方式向后端发送请求$('#order_btn').click(function() {
addr_id = $('input[name="addr_id"]:checked').val();
pay_method = $('input[name="pay_style"]:checked').val();
sku_ids = $(this).attr('sku_ids');
csrf = $('input[name="csrfmiddlewaretoken"]').val();
params = {"addr_id":addr_id, "pay_method":pay_method, "sku_ids":sku_ids, "csrfmiddlewaretoken":csrf};
$.post('/order/commit',params, function (data) {
});
step5 紧接着在后端中定义类视图post方法,配置url路由class OrderCommitView(View):
"""创建订单"""
def post(self, request):
pass
url(r"^commit$", OrderCommitView.as_view(), name='commit'),
step6 判断用户是否登录,获取参数以及校验参数完整性user = request.user
if not user.is_authenticated():
return JsonResponse({"errno": 0, "error_msg": "请先登录"})
addr_id = request.POST.get("addr_id")
pay_method = request.POST.get("pay_method")
sku_ids = request.POST.get("sku_ids")
if not all([addr_id, pay_method, sku_ids]):
return JsonResponse({"errno": 1, "error_msg": "参数不完整"})
step7 判断传递的支付方式以及收货地址是否合法if pay_method not in OrderInfo.pay_method.key():
return JsonResponse({"errno": 2, "error_msg": "非法的支付方式"})
try:
addr = Address.objects.get(id=addr_id)
except Address.DoesNotExist:
return JsonResponse({"errno": 3, "error_msg": "非法的收货地址"})
step8 向df_order_info表中插入记录,提交订单会在df_order_info以及df_order_goods这两张表中各产生一条记录,由于df_order_goods表外键为df_order_info表,所以需要先在df_order_info表中产生订单记录,在df_order_info表字段中,还需要去获取order_id,total_count,total_price,transit_priceorder_id = datetime.now().strftime("%Y%m%d%H%M%S") + str(user.id)
total_count = 0
total_price = 0
transit_price = 10
order = OrderInfo.objects.create(
order_id=order_id, user=user,
addr=addr, pay_method=pay_method,
total_count=total_count, total_price=total_price,
transit_price=transit_price)
step9 向df_order_goods表中插入记录,有多少种商品插入多少条记录conn = get_redis_connection("default")
cart_key = "cart_%d" % user.id
sku_ids = sku_ids.split(',')
for sku_id in sku_ids:
try:
sku = GoodsSKU.objects.get(id=sku_id)
except GoodsSKU.DoesNotExist:
return JsonResponse({"errno": 4, "error_msg": "商品不存在"})
count = conn.hget(cart_key, sku_id)
OrderGoods.objects.create(
order=order,sku=sku,
count=count,price=sku.price)
sku.stock -= int(count)
sku.sales += int(count)
sku.save()
amount = sku.price * int(count)
total_count += int(count)
total_price +
相关知识
Python Web开发(详细教程)
基于Python的鲜花销售平台设计与实现(Django框架) 研究背景与意义、国内外研究现状
从前端到后端——完整的Web开发指南
基于Python爬虫的电商网站彩妆数据的分析与研究
【花店管理与推荐系统】Python+管理系统+网站开发+Django网页界面+推荐系统
Python+Django框架淘宝零食销售数据可视化系统网站作品截图和开题报告参考
【QT教程】QT6 Web开发入门 QT Web
Java通用型支付+电商平台双系统实战
【25届计算机毕设选题推荐】基于Django花卉商城系统的设计与实现 【附源码+部署+讲解】
鸿蒙应用开发实战项目,看这一篇文章就够了(部分项目附源码)
网址: Django项目之Web端电商网站的实战开发(完结) https://m.huajiangbk.com/newsview838848.html
上一篇: 求mk资源 |
下一篇: Django项目之Web端电商网 |