视图函数views.py

  1. # /goods/商品id
  2. class DetailView(View):
  3. '''详情页'''
  4. def get(self, request, goods_id):
  5. '''显示详情页'''
  6. try:
  7. sku = GoodsSKU.objects.get(id=goods_id)
  8. except GoodsSKU.DoesNotExist:
  9. # 商品不存在
  10. return redirect(reverse('goods:index'))
  11.  
  12. # 获取商品的分类信息
  13. types = GoodsType.objects.all()
  14.  
  15. # 获取商品的评论信息
  16. sku_orders = OrderGoods.objects.filter(sku=sku).exclude(comment='')
  17.  
  18. # 获取新品信息
  19. new_skus = GoodsSKU.objects.filter(type=sku.type).order_by('-create_time')[:2]
  20.  
  21. # 获取同一个SPU的其他规格商品
  22. same_spu_skus = GoodsSKU.objects.filter(goods=sku.goods).exclude(id=goods_id)
  23.  
  24. # 获取用户购物车中商品的数目
  25. user = request.user
  26. cart_count = 0
  27. if user.is_authenticated():
  28. # 用户已登录
  29. conn = get_redis_connection('default')
  30. cart_key = 'cart_%d' % user.id
  31. cart_count = conn.hlen(cart_key)
  32.  
  33. # 添加用户的历史记录
  34. conn = get_redis_connection('default')
  35. history_key = 'history_%d'%user.id
  36. # 移除列表中的goods_id
  37. conn.lrem(history_key, 0, goods_id)
  38. # 把goods_id插入到列表的左侧
  39. conn.lpush(history_key, goods_id)
  40. # 只保存用户最新浏览的5条信息
  41. conn.ltrim(history_key, 0, 4)
  42.  
  43. # 组织模板上下文
  44. context = {'sku':sku, 'types':types,
  45. 'sku_orders':sku_orders,
  46. 'new_skus':new_skus,
  47. 'same_spu_skus':same_spu_skus,
  48. 'cart_count':cart_count}
  49.  
  50. # 使用模板
  51. return render(request, 'detail.html', context)

模板detail.html

  1. {% extends 'base_detail_list.html' %}
  2. {% load staticfiles %}
  3. {% block title %}天天生鲜-商品详情{% endblock title %}
  4.  
  5. {% block main_content %}
  6. <div class="breadcrumb">
  7. <a href="#">全部分类</a>
  8. <span>></span>
  9. <a href="#">{{ sku.type.name }}</a>
  10. <span>></span>
  11. <a href="#">商品详情</a>
  12. </div>
  13.  
  14. <div class="goods_detail_con clearfix">
  15. <div class="goods_detail_pic fl"><img src="{{ sku.image.url }}"></div>
  16.  
  17. <div class="goods_detail_list fr">
  18. <h3>{{ sku.name }}</h3>
  19. <p>{{ sku.desc }}</p>
  20. <div class="prize_bar">
  21. <span class="show_pirze">¥<em>{{ sku.price }}</em></span>
  22. <span class="show_unit">单 位:{{ sku.unite }}</span>
  23. </div>
  24. <div class="goods_num clearfix">
  25. <div class="num_name fl">数 量:</div>
  26. <div class="num_add fl">
  27. <input type="text" class="num_show fl" value="1">
  28. <a href="javascript:;" class="add fr">+</a>
  29. <a href="javascript:;" class="minus fr">-</a>
  30. </div>
  31. </div>
  32. <div>
  33. <p>其他规格:</p>
  34. <ul>
  35. {% for sku in same_spu_skus %}
  36. <li><a href="{% url 'goods:detail' sku.id %}">{{ sku.name }}</a></li>
  37. {% endfor %}
  38. </ul>
  39. </div>
  40.  
  41. <div class="total">总价:<em>16.80元</em></div>
  42. <div class="operate_btn">
  43. {% csrf_token %}
  44. <a href="javascript:;" class="buy_btn">立即购买</a>
  45. <a href="javascript:;" sku_id="{{ sku.id }}" class="add_cart" id="add_cart">加入购物车</a>
  46. </div>
  47. </div>
  48. </div>
  49.  
  50. <div class="main_wrap clearfix">
  51. <div class="l_wrap fl clearfix">
  52. <div class="new_goods">
  53. <h3>新品推荐</h3>
  54. <ul>
  55. {% for sku in new_skus %}
  56. <li>
  57. <a href="{% url 'goods:detail' sku.id %}"><img src="{{ sku.image.url }}"></a>
  58. <h4><a href="{% url 'goods:detail' sku.id %}">{{ sku.name }}</a></h4>
  59. <div class="prize">¥{{ sku.price }}</div>
  60. </li>
  61. {% endfor %}
  62. </ul>
  63. </div>
  64. </div>
  65.  
  66. <div class="r_wrap fr clearfix">
  67. <ul class="detail_tab clearfix">
  68. <li class="active">商品介绍</li>
  69. <li>评论</li>
  70. </ul>
  71.  
  72. <div class="tab_content">
  73. <dl>
  74. <dt>商品详情:</dt>
  75. <dd>{{ sku.goods.detail|safe }}</dd>
  76. </dl>
  77. </div>
  78.  
  79. <div class="tab_content">
  80. <dl>
  81. {% for order in sku_orders %}
  82. <dt>评论时间:{{ order.update_time }}&nbsp;&nbsp;用户名:{{ order.order.user.username }}</dt>
  83. <dd>评论内容:{{ order.comment }}</dd>
  84. {% endfor %}
  85. </dl>
  86. </div>
  87. </div>
  88. </div>
  89. {% endblock main_content %}
  90. {% block bottom %}
  91. <div class="add_jump"></div>
  92. {% endblock bottom %}
  93. {% block bottomfiles %}
  94. <script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
  95. <script type="text/javascript">
  96. update_goods_amount()
  97. // 计算商品的总价格
  98. function update_goods_amount() {
  99. // 获取商品的单价和数量
  100. price = $('.show_pirze').children('em').text()
  101. count = $('.num_show').val()
  102. // 计算商品的总价
  103. price = parseFloat(price)
  104. count = parseInt(count)
  105. amount = price*count
  106. // 设置商品的总价
  107. $('.total').children('em').text(amount.toFixed(2)+'元')
  108. }
  109.  
  110. // 增加商品的数量
  111. $('.add').click(function () {
  112. // 获取商品原有的数目
  113. count = $('.num_show').val()
  114. // 加1
  115. count = parseInt(count)+1
  116. // 重新设置商品的数目
  117. $('.num_show').val(count)
  118. // 更新商品的总价
  119. update_goods_amount()
  120. })
  121.  
  122. // 减少商品的数量
  123. $('.minus').click(function () {
  124. // 获取商品原有的数目
  125. count = $('.num_show').val()
  126. // 减1
  127. count = parseInt(count)-1
  128. if (count <= 0){
  129. count = 1
  130. }
  131. // 重新设置商品的数目
  132. $('.num_show').val(count)
  133. // 更新商品的总价
  134. update_goods_amount()
  135. })
  136.  
  137. // 手动输入商品的数量
  138. $('.num_show').blur(function () {
  139. // 获取用户输入的数目
  140. count = $(this).val()
  141. // 校验count是否合法
  142. if (isNaN(count) || count.trim().length==0 || parseInt(count) <=0){
  143. count = 1
  144. }
  145. // 重新设置商品的数目
  146. $(this).val(parseInt(count))
  147. // 更新商品的总价
  148. update_goods_amount()
  149. })
  150.  
  151. // 获取add_cart div元素左上角的坐标
  152. var $add_x = $('#add_cart').offset().top;
  153. var $add_y = $('#add_cart').offset().left;
  154.  
  155. // 获取show_count div元素左上角的坐标
  156. var $to_x = $('#show_count').offset().top;
  157. var $to_y = $('#show_count').offset().left;
  158.  
  159. $('#add_cart').click(function(){
  160. // 获取商品id和商品数量
  161. sku_id = $(this).attr('sku_id') // attr prop
  162. count = $('.num_show').val()
  163. csrf = $('input[name="csrfmiddlewaretoken"]').val()
  164. // 组织参数
  165. params = {'sku_id':sku_id, 'count':count, 'csrfmiddlewaretoken':csrf}
  166. // 发起ajax post请求,访问/cart/add, 传递参数:sku_id count
  167. $.post('/cart/add', params, function (data) {
  168. if (data.res == 5){
  169. // 添加成功
  170. $(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'})
  171. $(".add_jump").stop().animate({
  172. 'left': $to_y+7,
  173. 'top': $to_x+7},
  174. "fast", function() {
  175. $(".add_jump").fadeOut('fast',function(){
  176. // 重新设置用户购物车中商品的条目数
  177. $('#show_count').html(data.total_count);
  178. });
  179. });
  180. }
  181. else{
  182. // 添加失败
  183. alert(data.errmsg)
  184. }
  185. })
  186. })
  187. </script>
  188. {% endblock bottomfiles %}

django-用户浏览记录添加及商品详情页的更多相关文章

  1. react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置

    现状:目前从商品详情页返回到商品列表页,还需要再去请求服务数据,还需要用户再去等待获取数据的过程,这样用户体验非常不好, 遇到的问题: 1:如何将数据缓存, 2:如何获取和保存列表滑动的高度, 3:判 ...

  2. Freemarker商品详情页静态化服务调用处理

    --------------------------------------------------------------------------------------------- [版权申明: ...

  3. 自己定义ViewGroup实现仿淘宝的商品详情页

    近期公司在新版本号上有一个须要. 要在首页加入一个滑动效果, 详细就是仿照X宝的商品详情页, 拉到页面底部时有一个粘滞效果, 例如以下图 X东的商品详情页,假设用户继续向上拉的话就进入商品图文描写叙述 ...

  4. 如何用Baas快速在腾讯云上开发小程序-系列4:实现客户侧商品列表、商品详情页程序

    版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/431172001487671163 来源:腾云阁 h ...

  5. ecshop 商品详情页显示同类别下的推荐商品

    1.打开goods.php文件找到下面代码 $smarty->assign('goods_rank', get_goods_rank($goods_id)); // 商品的销售排名 在上面的代码 ...

  6. 商品详情页系统的Servlet3异步化实践

    http://jinnianshilongnian.iteye.com/blog/2245925 博客分类: 架构   在京东工作的这一年多时间里,我在整个商品详情页系统(后端数据源)及商品详情页统一 ...

  7. Android跳转淘宝、京东APP商品详情页

    import Android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; imp ...

  8. iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页

      公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...

  9. iOS app url scheme跳转到淘宝商品详情页 唤醒app

    最近涉及的一个业务,在app内的一个广告,点击打开webView,加载的是一个淘宝商品详情页,效果是打开该webView自动跳转至淘宝对应的页面,同时在自己的app仍然加载页面,点击评论等也同样能跳转 ...

随机推荐

  1. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  2. C++函数形参与实参交换

    c++中函数的实参传递到形参的值是单向的,改变形参并不会影响实参. #include <iostream> using namespace std; void swap(int a, in ...

  3. ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi

    写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...

  4. deppin Linux下安装docker

    首先楼主用的是deppin15.11 docker 简介:Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. ...

  5. 如何在CentOS / RHEL 7上启用IPv6

    默认情况下,在RHEL / CenOS 7系统上启用IPv6.因此,如果故意在系统上禁用IPv6,则可以通过以下任一方法重新启用它. 1.在内核模块中启用IPv6(需要重启)2.使用sysctl设置启 ...

  6. Charles配置https

    1. 安装Charles ,破解将Charles.jar 覆盖安装路径的\lib 中的文件 2. 查看本机IP 3. 设置手机代理 4. 设置: 5. 手机安装证书 手机浏览器输入网址:chls.pr ...

  7. JS把格林威治时间转换为北京标准时间

    function fermitTime(time){ var now = new Date(time); var year = now.getFullYear(); ; var date= now.g ...

  8. Python 第三方日志框架loguru使用

    解决中文乱码问题 项目地址 github: https://github.com/Delgan/loguru 文档:https://loguru.readthedocs.io/en/stable/in ...

  9. react性能优化要点

    1.减少render方法的调用 1.1继承React.PureComponent(会自动在内部使用shouldComponentUpdate方法对state或props进行浅比较.)或在继承自Reac ...

  10. Node中require第三方模块的规则

    Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...