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= ...
随机推荐
- 解决UEditor编辑时,只添加视频内容,不添加文字,视频信息不能保存到数据库的问题
造成这个问题的原因是富文本保存内容时会筛除空标签,然后统计是否有内容,通过字数统计也可以看到,上传完视频后字数还是零,因为视频上传后是<video></video>标签,这个标 ...
- Oracle的number数据类型
https://www.cnblogs.com/oumyye/p/4448656.html NUMBER ( precision, scale) precision表示数字中的有效位;如果没有指定pr ...
- JAVA集合框架 - Collection
collection大致介绍 Collection是集合层次结构中的根接口. 集合表示一组对象.有些集合允许重复元素,有些则不允许.有些是有序的,有些是无序的. JDK没有提供此接口的任何直接实现:它 ...
- dup与dup2函数
依赖的头文件 #include <unistd.h> 函数定义 int dup(int oldfd); int dup2(int oldfd, int newfd); 函数作用 dup和d ...
- Pop Sequence 题解
Pop Sequence(PAT) https://www.nowcoder.com/pat/5/problem/4090 前言: PAT上一道Stack的应用题,简化版的有<信息学一本通·普及 ...
- redis 链接数满了
服务器上可以设置timeout参数,这样可以将限制的连接自动释放掉.
- Oracle查询表空间使用率很慢
Oracle查询表空间使用率很慢 问题描述 执行查询表空间的语句,需要接近2min的时间才能执行完成. 以前也在其他客户的生产库遇到过一样的情况,当时是由于回收站的内容过多引起的. 不过这次的情况却不 ...
- java语言基础(三)_数组
数组 是引用类型 1. 容器:是将多个数据存储到一起,每个数据称为该容器的元素. 2. 数组概念:数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致. 特点: 数组是一种引用数据类型 数组当 ...
- html通过css,js实现div悬浮效果总汇,如原生JS实现滚动到一定位置实现div悬浮
在我们的实际开发中,经常会遇到页面中需要悬浮效果,比如最早的客服联系,对联悬浮广告等,今天为大家介绍一些如何实现div悬浮的效果. 传统的fixed实现: 通过css中的属性position参数设为f ...
- day29 继承
目录 一.property装饰器 应用场景1 应用场景2 应用场景3(场景2优化) 二.继承介绍 1 语法 2 属性查找 3 继承的实现原理 3.1 菱形问题 3.2 继承原理 3.3 深度优先和广度 ...