• 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 %}
  • 相关阅读:
    3.7日复习
    作业
    小米官网需要的数据
    EL&JSTL
    变量和运算符
    jsp
    session的应用----验证码
    restframework-总结
    Django-Rest-Framework部分源码流程分析
    Django-Rest-Framework
  • 原文地址:https://www.cnblogs.com/yifengs/p/11625261.html
Copyright © 2020-2023  润新知