django-用户浏览记录添加及商品详情页
视图函数views.py
- # /goods/商品id
- class DetailView(View):
- '''详情页'''
- def get(self, request, goods_id):
- '''显示详情页'''
- try:
- sku = GoodsSKU.objects.get(id=goods_id)
- except GoodsSKU.DoesNotExist:
- # 商品不存在
- return redirect(reverse('goods:index'))
- # 获取商品的分类信息
- types = GoodsType.objects.all()
- # 获取商品的评论信息
- sku_orders = OrderGoods.objects.filter(sku=sku).exclude(comment='')
- # 获取新品信息
- new_skus = GoodsSKU.objects.filter(type=sku.type).order_by('-create_time')[:2]
- # 获取同一个SPU的其他规格商品
- same_spu_skus = GoodsSKU.objects.filter(goods=sku.goods).exclude(id=goods_id)
- # 获取用户购物车中商品的数目
- user = request.user
- cart_count = 0
- if user.is_authenticated():
- # 用户已登录
- conn = get_redis_connection('default')
- cart_key = 'cart_%d' % user.id
- cart_count = conn.hlen(cart_key)
- # 添加用户的历史记录
- conn = get_redis_connection('default')
- history_key = 'history_%d'%user.id
- # 移除列表中的goods_id
- conn.lrem(history_key, 0, goods_id)
- # 把goods_id插入到列表的左侧
- conn.lpush(history_key, goods_id)
- # 只保存用户最新浏览的5条信息
- conn.ltrim(history_key, 0, 4)
- # 组织模板上下文
- context = {'sku':sku, 'types':types,
- 'sku_orders':sku_orders,
- 'new_skus':new_skus,
- 'same_spu_skus':same_spu_skus,
- 'cart_count':cart_count}
- # 使用模板
- return render(request, 'detail.html', context)
模板detail.html
- {% extends 'base_detail_list.html' %}
- {% load staticfiles %}
- {% block title %}天天生鲜-商品详情{% endblock title %}
- {% block main_content %}
- <div class="breadcrumb">
- <a href="#">全部分类</a>
- <span>></span>
- <a href="#">{{ sku.type.name }}</a>
- <span>></span>
- <a href="#">商品详情</a>
- </div>
- <div class="goods_detail_con clearfix">
- <div class="goods_detail_pic fl"><img src="{{ sku.image.url }}"></div>
- <div class="goods_detail_list fr">
- <h3>{{ sku.name }}</h3>
- <p>{{ sku.desc }}</p>
- <div class="prize_bar">
- <span class="show_pirze">¥<em>{{ sku.price }}</em></span>
- <span class="show_unit">单 位:{{ sku.unite }}</span>
- </div>
- <div class="goods_num clearfix">
- <div class="num_name fl">数 量:</div>
- <div class="num_add fl">
- <input type="text" class="num_show fl" value="1">
- <a href="javascript:;" class="add fr">+</a>
- <a href="javascript:;" class="minus fr">-</a>
- </div>
- </div>
- <div>
- <p>其他规格:</p>
- <ul>
- {% for sku in same_spu_skus %}
- <li><a href="{% url 'goods:detail' sku.id %}">{{ sku.name }}</a></li>
- {% endfor %}
- </ul>
- </div>
- <div class="total">总价:<em>16.80元</em></div>
- <div class="operate_btn">
- {% csrf_token %}
- <a href="javascript:;" class="buy_btn">立即购买</a>
- <a href="javascript:;" sku_id="{{ sku.id }}" class="add_cart" id="add_cart">加入购物车</a>
- </div>
- </div>
- </div>
- <div class="main_wrap clearfix">
- <div class="l_wrap fl clearfix">
- <div class="new_goods">
- <h3>新品推荐</h3>
- <ul>
- {% for sku in new_skus %}
- <li>
- <a href="{% url 'goods:detail' sku.id %}"><img src="{{ sku.image.url }}"></a>
- <h4><a href="{% url 'goods:detail' sku.id %}">{{ sku.name }}</a></h4>
- <div class="prize">¥{{ sku.price }}</div>
- </li>
- {% endfor %}
- </ul>
- </div>
- </div>
- <div class="r_wrap fr clearfix">
- <ul class="detail_tab clearfix">
- <li class="active">商品介绍</li>
- <li>评论</li>
- </ul>
- <div class="tab_content">
- <dl>
- <dt>商品详情:</dt>
- <dd>{{ sku.goods.detail|safe }}</dd>
- </dl>
- </div>
- <div class="tab_content">
- <dl>
- {% for order in sku_orders %}
- <dt>评论时间:{{ order.update_time }} 用户名:{{ order.order.user.username }}</dt>
- <dd>评论内容:{{ order.comment }}</dd>
- {% endfor %}
- </dl>
- </div>
- </div>
- </div>
- {% endblock main_content %}
- {% block bottom %}
- <div class="add_jump"></div>
- {% endblock bottom %}
- {% block bottomfiles %}
- <script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
- <script type="text/javascript">
- update_goods_amount()
- // 计算商品的总价格
- function update_goods_amount() {
- // 获取商品的单价和数量
- price = $('.show_pirze').children('em').text()
- count = $('.num_show').val()
- // 计算商品的总价
- price = parseFloat(price)
- count = parseInt(count)
- amount = price*count
- // 设置商品的总价
- $('.total').children('em').text(amount.toFixed(2)+'元')
- }
- // 增加商品的数量
- $('.add').click(function () {
- // 获取商品原有的数目
- count = $('.num_show').val()
- // 加1
- count = parseInt(count)+1
- // 重新设置商品的数目
- $('.num_show').val(count)
- // 更新商品的总价
- update_goods_amount()
- })
- // 减少商品的数量
- $('.minus').click(function () {
- // 获取商品原有的数目
- count = $('.num_show').val()
- // 减1
- count = parseInt(count)-1
- if (count <= 0){
- count = 1
- }
- // 重新设置商品的数目
- $('.num_show').val(count)
- // 更新商品的总价
- update_goods_amount()
- })
- // 手动输入商品的数量
- $('.num_show').blur(function () {
- // 获取用户输入的数目
- count = $(this).val()
- // 校验count是否合法
- if (isNaN(count) || count.trim().length==0 || parseInt(count) <=0){
- count = 1
- }
- // 重新设置商品的数目
- $(this).val(parseInt(count))
- // 更新商品的总价
- update_goods_amount()
- })
- // 获取add_cart div元素左上角的坐标
- var $add_x = $('#add_cart').offset().top;
- var $add_y = $('#add_cart').offset().left;
- // 获取show_count div元素左上角的坐标
- var $to_x = $('#show_count').offset().top;
- var $to_y = $('#show_count').offset().left;
- $('#add_cart').click(function(){
- // 获取商品id和商品数量
- sku_id = $(this).attr('sku_id') // attr prop
- count = $('.num_show').val()
- csrf = $('input[name="csrfmiddlewaretoken"]').val()
- // 组织参数
- params = {'sku_id':sku_id, 'count':count, 'csrfmiddlewaretoken':csrf}
- // 发起ajax post请求,访问/cart/add, 传递参数:sku_id count
- $.post('/cart/add', params, function (data) {
- if (data.res == 5){
- // 添加成功
- $(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'})
- $(".add_jump").stop().animate({
- 'left': $to_y+7,
- 'top': $to_x+7},
- "fast", function() {
- $(".add_jump").fadeOut('fast',function(){
- // 重新设置用户购物车中商品的条目数
- $('#show_count').html(data.total_count);
- });
- });
- }
- else{
- // 添加失败
- alert(data.errmsg)
- }
- })
- })
- </script>
- {% endblock bottomfiles %}
django-用户浏览记录添加及商品详情页的更多相关文章
- react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置
现状:目前从商品详情页返回到商品列表页,还需要再去请求服务数据,还需要用户再去等待获取数据的过程,这样用户体验非常不好, 遇到的问题: 1:如何将数据缓存, 2:如何获取和保存列表滑动的高度, 3:判 ...
- Freemarker商品详情页静态化服务调用处理
--------------------------------------------------------------------------------------------- [版权申明: ...
- 自己定义ViewGroup实现仿淘宝的商品详情页
近期公司在新版本号上有一个须要. 要在首页加入一个滑动效果, 详细就是仿照X宝的商品详情页, 拉到页面底部时有一个粘滞效果, 例如以下图 X东的商品详情页,假设用户继续向上拉的话就进入商品图文描写叙述 ...
- 如何用Baas快速在腾讯云上开发小程序-系列4:实现客户侧商品列表、商品详情页程序
版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/431172001487671163 来源:腾云阁 h ...
- ecshop 商品详情页显示同类别下的推荐商品
1.打开goods.php文件找到下面代码 $smarty->assign('goods_rank', get_goods_rank($goods_id)); // 商品的销售排名 在上面的代码 ...
- 商品详情页系统的Servlet3异步化实践
http://jinnianshilongnian.iteye.com/blog/2245925 博客分类: 架构 在京东工作的这一年多时间里,我在整个商品详情页系统(后端数据源)及商品详情页统一 ...
- Android跳转淘宝、京东APP商品详情页
import Android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; imp ...
- iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页
公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...
- iOS app url scheme跳转到淘宝商品详情页 唤醒app
最近涉及的一个业务,在app内的一个广告,点击打开webView,加载的是一个淘宝商品详情页,效果是打开该webView自动跳转至淘宝对应的页面,同时在自己的app仍然加载页面,点击评论等也同样能跳转 ...
随机推荐
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- C++函数形参与实参交换
c++中函数的实参传递到形参的值是单向的,改变形参并不会影响实参. #include <iostream> using namespace std; void swap(int a, in ...
- ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi
写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...
- deppin Linux下安装docker
首先楼主用的是deppin15.11 docker 简介:Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. ...
- 如何在CentOS / RHEL 7上启用IPv6
默认情况下,在RHEL / CenOS 7系统上启用IPv6.因此,如果故意在系统上禁用IPv6,则可以通过以下任一方法重新启用它. 1.在内核模块中启用IPv6(需要重启)2.使用sysctl设置启 ...
- Charles配置https
1. 安装Charles ,破解将Charles.jar 覆盖安装路径的\lib 中的文件 2. 查看本机IP 3. 设置手机代理 4. 设置: 5. 手机安装证书 手机浏览器输入网址:chls.pr ...
- JS把格林威治时间转换为北京标准时间
function fermitTime(time){ var now = new Date(time); var year = now.getFullYear(); ; var date= now.g ...
- Python 第三方日志框架loguru使用
解决中文乱码问题 项目地址 github: https://github.com/Delgan/loguru 文档:https://loguru.readthedocs.io/en/stable/in ...
- react性能优化要点
1.减少render方法的调用 1.1继承React.PureComponent(会自动在内部使用shouldComponentUpdate方法对state或props进行浅比较.)或在继承自Reac ...
- Node中require第三方模块的规则
Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...