DJANGO-天天生鲜项目从0到1-014-订单-订单评论
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习
https://www.bilibili.com/video/BV1vt41147K8?p=1
编辑用户订单页面JS
根据订单状态显示下一步操作是什么,若用户点击‘去评价’,则通过 location.href= '/order/comment/'+order_id 访问订单评价url
//根据订单状态显示下一步操作
$('.oper_btn').each(function(){
status = $(this).attr('order_status')
if (status == '1'){
oper_show = '去支付'
}
else if (status =='4'){
oper_show = '去评价'
}
else{
oper_show = $(this).attr('status_name')
}
$(this).text(oper_show)
})
//去支付按钮
$('.oper_btn').click(function(){
//获取订单ID
order_id = $(this).attr('order_id')
//若状态为待支付,则发送ajax支付请求
if ($(this).attr('order_status') =='1'){
pay_method = $(this).attr('pay_method')
send_pay_ajax(order_id, pay_method)
}
//若状态为待评价,则跳转到评价界面
else if($(this).attr('order_status') == '4'){
//跳转到评价页面
location.href = '/order/comment/'+order_id
}
})
添加评价URL和视图类
在apps/order/url.py中配置评价url
from order.views import OrderCommentView urlpatterns = [
...
path('comment/<int:order_id>/', OrderCommentView.as_view(), name='comment')
...
]
编辑apps/order/view.py,新增OrderCommentView
使用reverse反向解析时,若url中带有参数,则在reverse中的第二个参数加上kwargs参数,key为url参数名
class OrderCommentView(LoginRequiredMixin, View):
'''订单评价视图'''
template_name = 'order/order_comment.html'
def get(self, request, order_id):
'''显示评价页面'''
user = request.user
# 校验数据
if not order_id:
return redirect(reverse('user:order', kwargs={'page_num': 1}))
try:
order = OrderInfo.objects.get(id=order_id, user=user)
except OrderInfo.DoesNotExist:
return redirect(reverse('user:order', kwargs={'page_num': 1}))
# 获取订单商品
order_goods_list = OrderGoods.objects.filter(order=order)
for order_goods in order_goods_list:
order_goods.amount = order_goods.count * order_goods.price
# 动态赋值属性
order.status_name = OrderInfo.ORDER_STATUS_DIC[order.order_status]
order.order_goods_list = order_goods_list
return render(request, self.template_name, {'order': order})
编辑模板文件
{% extends 'base_user_center.html' %}
{% load static %}
{% block title %}天天生鲜-用户中心{% endblock %}
{% block page_title %}用户中心{% endblock page_title %}
{% block right %}
<div class="right_content clearfix">
<h3 class="common_title2">订单评价</h3>
<ul class="order_list_th w978 clearfix">
<li class="col01">{{ order.create_time }}</li>
<li class="col02">订单号:{{order.order_num}}</li>
<li class="col02 stress">{{order.status_name}}</li>
</ul>
<form method="post">
{% csrf_token %}
{# 订单id #}
<input type="hidden" name="order_id" value="{{order.order_id}}">
{# 订单中有几个商品 #}
<input type="hidden" name="total_count" value="{{order.order_goods_list|length}}">
{% for order_goods in order.order_goods_list %}
<table class="order_list_table w980">
<tbody>
<tr>
<td width="80%">
<ul class="order_goods_list clearfix">
<li class="col01"><img src="{{order_goods.goods.image.url }}"></li>
<li class="col02">{{order_goods.goods.name}}<em>{{order_goods.price}}/{{order_goods.goods.unite}}</em></li>
<li class="col03">{{order_goods.count}}</li>
</ul>
</td>
<td width="20%">{{order_goods.amount}}元</td>
</tr>
</tbody>
</table>
<div class="site_con">
<input type="hidden" name="goods_{{forloop.counter}}" value="{{order_goods.goods.id}}">
<div class="form_group form_group2">
<label>评价内容:</label>
<textarea class="site_area" name="content_{{forloop.counter}}"></textarea>
</div>
</div>
{% endfor %}
<input type="submit" name="" value="提交" class="info_submit">
</form>
</div>
{% endblock right %}
评价页面是该订单中每个商品下面都可以进行评价,因此在提交时,需要将输入框与对应的商品绑定,才能知道这个评价是哪个商品的。这里在每个评论框前面,新增了一个隐藏的input框,name为goods_{{forloop.counter}},value为{{order_goods.goods.id}},同时将评论框textarea的name也写成content_{{ forloop.counter }},input和textarea的name都使用了同一个“forloop.counter”来进行绑定,同时在循环商品前,也新增一个隐藏的input框将商品总数也传给了POST,这里的value="{{order.order_goods_list|length}}",使用了django模板的过滤器|length,还有其他的过滤器如:{{ value|add:"2" }}、{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}、{{ value|lower }}等等。

提交评论调用post请求
继续编辑OrderCommitView,添加post方法
循环商品,通过循环计数i获取当前商品的id和评论
def post(self, request, order_id):
'''评价提交'''
user = request.user
# 获取数据
total_count = int(request.POST.get('total_count'))
# 校验数据
if not order_id:
return redirect(reverse('user:order', kwargs={'page_num': 1}))
try:
order = OrderInfo.objects.get(id=order_id, user=user)
except OrderInfo.DoesNotExist:
redirect(reverse('user:order', kwargs={'page_num': 1})) for i in range(1, total_count+1):
# 获取评论
comment = request.POST.get('content_%d' % i, '')
# 获取商品ID
goods_id = int(request.POST.get('goods_%d' % i))
try:
goods = OrderGoods.objects.get(order=order, goods_id=goods_id)
except Goods.DoesNotExist:
continue
goods.comment = comment
goods.save() order.order_status = 5 # 已完成
order.save() return redirect(reverse('user:order', kwargs={'page_num': 1}))
DJANGO-天天生鲜项目从0到1-014-订单-订单评论的更多相关文章
- django天天生鲜项目
.后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...
- DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- python 天天生鲜项目
python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...
- Django之天天生鲜项目
准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...
- DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- DJANGO-天天生鲜项目从0到1-006-首页-内容展示
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
随机推荐
- base64格式的图片上传阿里云
base64格式的图片上传阿里云 上传图片的时候,除了普通的图片上传,还有一张图片信息是以base64格式发送到后台的. 后台接受base64格式的图片,上传至阿里云代码:(主要是将base64转化成 ...
- element ui 版本升级
element ui 版本升级 1. 卸载之前版本 npm uninstall element-ui 2.重新安装element-ui npm i element-ui 3.就如package.jso ...
- 计算机网络之ARP协议
ARP ARP(Address Resolution Protocol),即地址解析协议,是根据IP地址解析物理地址的一个TCP/IP协议.主机将包含目标IP地址信息的ARP请求广播到网络中的所有主机 ...
- keras中loss与val_loss的关系
loss是训练集的损失值,val_loss是测试集的损失值 以下是loss与val_loss的变化反映出训练走向的规律总结: train loss 不断下降,test loss不断下降,说明网络仍在学 ...
- SerializableClob转String
ORACLE数据库读取CLOB字段,JAVA中获取到类型为SerializableClob,如何转换成String类型那? 以下是代码示例: SerializableClob sc = ...
- JavaScript基础数组的字面声名法(010)
1.两种方法的对比 数组在JavaScript中,就像大多数的其它语言 一样,是对象.我们可以使用JavaScript内置的数组构造函数Array()来创建数组.就象对象的字面声名法一样,数组也可以采 ...
- Orleans 框架3.0 官方文档中文版系列一 —— 概述
关于这个翻译文档的一些说明: 之前逛博客园的时候,看见有个园友在自己的博客上介绍Orleans. 觉得Orleans 是个好东西. 当时心想:如果后面有业务需要的时候可以用用Orleans框架. 当真 ...
- Python3笔记008 - 2.5 运算符
第2章 python语言基础 运算符:是一些特殊的符号,主要用于数学计算等. 表达式:使用运算符将不同类型的数据按照一定的规则连接起来的式子. 分类:算术运算符.赋值运算符.比较运算符.逻辑运算符.位 ...
- Asp.Net Core Blazor之容器部署
写在前面 Docker作为开源的应用容器引擎,可以让我们很轻松的构建一个轻量级.易移植的容器,通过Docker方式进行持续交付.测试和部署,都是极为方便的,并且对于我们开发来说,最直观的优点还是解决了 ...
- 生日聚会Party——这个线性dp有点嚣张
题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算 坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续 ...