本项目基于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-订单-订单评论的更多相关文章

  1. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  2. DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  4. python 天天生鲜项目

    python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...

  5. Django之天天生鲜项目

    准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...

  6. DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  10. DJANGO-天天生鲜项目从0到1-006-首页-内容展示

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

随机推荐

  1. 微信小程序navigator带参数跳转及接收参数内容

    // index.wxml <navigator class='looks-view' wx:for="{{imgUrlNew}}" wx:key="index&q ...

  2. YoyoGo基于ASP.NET Core设计的Golang实现

    YoyoGo YoyoGo 是一个用 Go 编写的简单,轻便,快速的 微服务框架,目前已实现了Web框架的能力,但是底层设计已支持. Github https://github.com/yoyofx/ ...

  3. C++中i++和++i的区别

    目录 效果上的区别 性能上的区别 分析汇编代码 进行性能实验 二者的选择 效果上的区别 i++是对变量i递增,但返回原值,++i是对变量i进行递增,并返回终值. 可以用以下代码加以验证: int i ...

  4. JavaScript基础对象创建模式之静态成员(027)

    在支持“类”的面向对象语言中,静态成员指的是那些所有实例对象共有的类成员.静态成员实际是是“类”的成员,而非“对象”的成员.所以如果 MathUtils类中有个叫 max()的静态成员方法,那么调用这 ...

  5. Hexo快速构建个人小站-Fulid主题下添加Valine评论系统(三)

    Hexo目录: Hexo快速构建个人小站-Hexo初始化和将项目托管在Github(一) Hexo快速构建个人小站-自定义域名和自定义主题(二) 背景交代: 前面两章完成了Hexo的初始化和部分自定义 ...

  6. 什么是JDK的SPI机制

    什么是SPI和API Application Programming Interface (API)? The API is the description of classes/interfaces ...

  7. Java 内存回收机制

    当执行构造方法生成一个对象时,需要占用各种系统资源.当生成的对象不再使用时,就需要返回给操作系统,以免资源的泄露.在各种系统资源中,最常使用的就是内存.Java运行时系统通过垃圾收集周期性地释放无用对 ...

  8. 关于WebServices的调用

    1.使用soapui测试接口是否能通    具体操作步骤请查看:https://www.cnblogs.com/BINDAI/p/13201513.html Soapui请求结果集 2.获得soapu ...

  9. 快速认识elasticsearch

    快速认识elasticsearch   what is Elasticsearch Elasticsearch被称为"Lucene穿了一件json的外衣"---把Lucene用Ne ...

  10. 如何白嫖微软Azure12个月及避坑指南

    Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国际不是 ...