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 }}&nbsp;&nbsp;用户名:{{ 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 %}

原文地址:https://www.cnblogs.com/yifengs/p/11625261.html

时间: 2024-10-30 08:28:10

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

ECSHOP 商品详情页购买数量 添加加减按钮

<input name="number" type="text" id="number" value="1" size="4" onblur="changePrice()" style="border:1px solid #ccc; "/> 修改为 <span class="goods_cut" _src="images

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

最近公司在新版本上有一个需要, 要在首页添加一个滑动效果, 具体就是仿照X宝的商品详情页, 拉到页面底部时有一个粘滞效果, 如下图 X东的商品详情页,如果用户继续向上拉的话就进入商品图文描述界面: 刚开始是想拿来主义,直接从网上找个现成的demo来用, 但是网上无一例外的答案都特别统一: 几乎全部是ScrollView中再套两个ScrollView,或者是一个LinearLayout中套两个ScrollView. 通过指定父view和子view的focus来切换滑动的处理界面---即通过view

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

--------------------------------------------------------------------------------------------- [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53151462 作者:朱培      ID:sdksdk0 ----------------------------------------------------

京东商品详情页应对“双11”大流量的技术实践

大家来京东打开商品页一般会看到如通用版.闪购.全球购等不同的页面风格,这里面会牵扯到各种各样垂直化的模板页面渲染.以前的解决方案是做静态化,但是静态化一个很大的问题就是页面改版时需要重新全量生成新的静态页.我们有几亿个商品,对于这么多商品,你如果生成页面的话需要跑很多天,而且还无法应对一些突发情况. 比如新的<广告法>,需要对一些数据进行清洗,后端清洗时间和成本来不及,那么很多时候就是从前台展示系统来进行数据过滤.因此需要非常灵活的前端展示架构来支持这种需求. 首先这是我们前端首屏大体的结构.

京东手机商品详情页技术解密

京东手机商品详情页技术解密 作者:陈保安,2011年加入京东,目前主要负责手机京东核心业务(搜索.商品.购物车.结算.收银台.我的京东)的后端研发工作.带领团队在一线奋战多年,积累了非常丰富的大促备战经验,也见证了核心系统从一分钟几千单到几十万单的质的蜕变. 京东手机单品页在每次大促时承载所有流量的入口,它被天然赋予的一个标签就是抗压,对系统的稳定性.性能方面要求极其苛刻,另外单品页本身业务复杂度较高,单品页有几十种垂直流程业务,并且展示上都要求个性化的单品页,加上依赖有50+的基础服务,稍有抖

亿级商品详情页架构演进技术解密 | 高可用架构系列

亿级商品详情页架构演进技术解密 | 高可用架构系列 --http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=210272034&idx=1&sn=3be9d2b53c7fec88716ee8affd2515f8&scene=1&srcid=UfXZNNOVZZyZjQmp0VOh&from=groupmessage&isappinstalled=0#rd 此文是开涛在[三体高可用架构群]之分享内容

电商网站商品模型之商品详情页设计方案

如下设计方案参考淘宝和华为商城 SKU SPU的关系 SPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.例如iphone4就是一个SPU,与套餐.存储容量.颜色无关. SKU=stock keeping unit(库存量单位)SKU即库存进出计量的单位, 可以是以件.盒.托盘等为单位.SKU是物理上不可分割的最小存货单元.在使用时要根据不同业态,不同管理模式来处理.例如32G

【转】京东商品详情页应对“双11”大流量的技术实践

原文链接:http://www.csdn.net/article/2015-12-28/2826570 大家来京东打开商品页一般会看到如通用版.闪购.全球购等不同的页面风格,这里面会牵扯到各种各样垂直化的模板页面渲染.以前的解决方案是做静态化,但是静态化一个很大的问题就是页面改版时需要重新全量生成新的静态页.我们有几亿个商品,对于这么多商品,你如果生成页面的话需要跑很多天,而且还无法应对一些突发情况. 比如新的<广告法>,需要对一些数据进行清洗,后端清洗时间和成本来不及,那么很多时候就是从前台

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

近期公司在新版本号上有一个须要. 要在首页加入一个滑动效果, 详细就是仿照X宝的商品详情页, 拉到页面底部时有一个粘滞效果, 例如以下图 X东的商品详情页,假设用户继续向上拉的话就进入商品图文描写叙述界面: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 刚開始是想拿来主义.直接从网上找个现成的de