美文网首页
day54-天天生鲜项目订单管理

day54-天天生鲜项目订单管理

作者: barriers | 来源:发表于2019-01-17 20:12 被阅读0次

1生成结算页面的相关数据

生成提交页面的商品种类及小计,总价等信息

def place_order(request):
    if request.method == 'GET':
        获取当前登陆系统的用户对象
        user = request.user
        carts = ShoppingCart.objects.filter(user=user, is_select=True).all()
         计算小计和总价
        total_price = 0
        for cart in carts:
             小计金额
            price = cart.goods.shop_price * cart.nums
             给cart添加一个小计的属性并赋值
            cart.goods_price = price
            总金额
            total_price += price
        获取当前登陆系统的用户的收货地址信息
        user_addrss = UserAddress.objects.filter(user=user).all()

        return render(request, 'place_order.html', {'carts': carts,
         'total_price': total_price, 'num': len(carts),
             'user_address': user_addrss})

寄送地址

        <dt>寄送到:</dt>
        {% for address in user_address %}
            <dd><input type="radio" name="address_radio" value="{{ address.id }}">
                {{ address.address }}
                ({{ address.signer_name }} 收 )
                {{ address.signer_mobile }}
            </dd>
        {% endfor %}

所提交的商品详情页面

     {% for cart in carts %}
        <ul class="goods_list_td clearfix">
            <li class="col01">{{ forloop.counter }}</li>
            <li class="col02"><img src="/media/{{ cart.goods.goods_front_image }}"></li>
            <li class="col03">{{ cart.goods.name }}</li>
            <li class="col04">500g</li>
            <li class="col05">{{ cart.goods.shop_price }}元</li>
            <li class="col06">{{ cart.nums }}</li>
            <li class="col07">{{ cart.goods_price }}元</li>
        </ul>
      {% endfor %}

金额结算

<h3 class="common_title">总金额结算</h3>
<div class="common_list_con clearfix">
<div class="settle_con">
<div class="total_goods_count">共<em>{{ num }}</em>件商品,总金额<b>{{ total_price }}元</b></div>
    <div class="transit">运费:<b>10元</b></div>
    <div class="total_pay">实付款:<b>{{ total_price | add:'10' }}元</b></div>
</div>
</div>

ajax异步请求传输数据并进行提示
多对多数据表,中间表中只有关联的两个表的外键,而将多对多的中间表自己定义成另一个表格,则除了添加两个一对多,还可以自己添加其他的一些字段;

        $('#order_btn').click(function() {
        localStorage.setItem('order_finish', 2);
        {#判断是否选择收货地址#}
        var address_radio = $('input[name="address_radio"]')
        for(var i=0;i<address_radio.length;i++){
            if(address_radio[i].checked == true){
                var ad_id = address_radio[i].value;

            }
        }
        if(ad_id){
            {#创建订单#}
            var csrf = $('input[name="csrfmiddlewaretoken"]').val()
            $.ajax({
                url:'/order/order/',
                type:'POST',
                data:{'ad_id':ad_id},
                dataType:'json',
                headers:{'X-CSRFToken':csrf},
                success:function (data) {
                    $('.popup p').text('提交订单成功')
                    $('.popup_con').fadeIn('fast', function() {
                        setTimeout(function(){
                        $('.popup_con').fadeOut('fast',function(){
                            window.location.href = '{% url 'goods:index' %}';
                    });
                    },3000)
                    });
                },
                error:function (data) {

                }
            })
        }else {
            {#没有收货地址,修改弹窗的信息“提交订单失败”#}
            $('.popup p').text('提交订单失败(请选择收货地址)')

            $('.popup_con').fadeIn('fast', function() {

            setTimeout(function(){
                $('.popup_con').fadeOut('fast',function(){
                    {#window.location.href = '{% url 'goods:index' %}';#}
                });
            },3000)

            });
        }

    });

收货地址选择按钮判断
$('input[name="address_ridio"]')获取input标签中name为address_ridio的标签
获取按钮中name属性为address_ridio的一系列标签的选择状态

        var address_radio = $('input[name="address_radio"]')
        for(var i=0;i<address_radio.length;i++){
            if(address_radio[i].checked == true){
                var ad_id = address_radio[i].value;

            }
        }

2提交订单时后台处理函数

def order(request):
if request.method == 'POST':
     1.获取收货地址值
    ad_id = request.POST.get('ad_id')
    2.创建订单
    user_id = request.session.get('user_id')
     获取订单编号
    order_sn = get_order_sn()
    shop_cart = ShoppingCart.objects.filter(user_id=user_id,
                                            is_select=True)
     计算订单总金额
    order_mount = 0
    for cart in shop_cart:
        order_mount += cart.goods.shop_price * cart.nums
     收货信息
    user_address = UserAddress.objects.filter(pk=ad_id).first()
    order = OrderInfo.objects.create(user_id=user_id, order_sn=order_sn,
                                     order_mount=order_mount, address=user_address,
                                     signer_name=user_address.signer_name,
                                     signer_mobile=user_address.signer_mobile)
     3.创建订单详情
    for cart in shop_cart:
        OrderGoods.objects.create(order=order, goods=cart.goods,
                                  goods_nums=cart.nums)
     4.删除购物车中已结算的商品
     删除数据库中的商品
    shop_cart.delete()
    session_goods = request.session.get('goods')
     删除session中已选择(结算)的物品
    for se_goods in session_goods[:]:
         se_goods结果[goods_id, nums, is_select]
        if se_goods[2]:
            session_goods.remove(se_goods)
    request.session['goods'] = session_goods
    return JsonResponse({'code': 200, 'msg': '请求成功'})

分页

<div class="pagenation">
    {% if orders.has_previous %}
    <a href="{% url 'order:user_order' %}?page={{ orders.previous_page_number }}">上一页</a>
    {% endif %}
    {% for i in orders.paginator.page_range %}
    <a href="{% url 'order:user_order' %}?page={{ i }}">{{ i }}</a>
    {% endfor %}
    {% if orders.has_next %}
     <a href="{% url 'order:user_order' %}?page={{ orders.next_page_number }}">下一页</a>
    {% endif %}
</div>

分页

  def user_order(request):
    if request.method == 'GET':
        activate = 'order'
        page = int(request.GET.get('page', 1))
         获取登陆系统用户的id值
        user_id = request.session.get('user_id')
         查询当前用户产生的订单信息
        orders = OrderInfo.objects.filter(user_id=user_id)
        status = OrderInfo.ORDER_STATUS
         分页,ORDER_NUMBER为工程目录中设置的每页显示的信息数量
        pg = Paginator(orders, ORDER_NUMBER)
        my_page = pg.page(page)
        return render(request, 'user_center_order.html',
         {'orders': my_page, 'status': status,'activate': activate}

3按钮页面选择

在html页面中嵌入{% include ‘xxx.html’ %}表示把其他页面的内容直接拿过来在本页面用

<ul>
    {% include 'base_user.html' %}
</ul>

‘xxx.html’中内容
当点击选项时,页面会对应出现activate中对应传过来的路由

<ul>
<li><a href="{% url 'user:user_info' %}"
{% if activate == 'info' %} class = "active" {% endif %}>· 个人信息</a></li>
<li><a href="{% url 'order:user_order' %}"
{% if activate == 'order' %} class = "active" {% endif %}>· 全部订单</a></li>
<li><a href="{% url 'user:user_center_site' %}" {% if activate == 'site' %} class = "active" {% endif %}>· 收货地址</a></li>
</ul>

视图函数中引入activate

def user_info(request):
    if request.method == 'GET':
        activate = 'info'
        return render(request, 'user_center_info.html', {'activate': activate})

4.文件部署

当需要对页面进行分页设置的时候,可以在settings中设置ORDER_NUMBER = 3,然后再,需要使用的位置导入这个变量。
当部署文章的时候,端口号设置成80端口时,访问的时候可以不加端口号访问。
当需要直接输入网址(不带端口后的路由)就访问某个指定的网页时,可以在工程目录的urls文件中的urlpatterns中添加首页路径

    from goods import views
    path('', views.index),

上面表示从index所在的goods应用中导入views,然后将访问应用设置成空,最后设置所访问的主页

4.1直接访问index下中间件设置访问拦截

由于index主页不需要进行访问拦截,故需要重新设置中间件登陆校验
主要添加以下两句

if path == '/':
    return None

由于访问地址都会自动在最后加/,所以不加路由访问的时候地址就是http://127.0.0.1:80/,当获取到路由的时候一般都是('/user/register/')这种格式,所以当直接将/加入到免登陆访问页面的时候,所有页面都会面登陆访问;故要将其分开来单独判断。
也可以在免登陆访问的路由列表中加入'^/$'使用正则的单词开头和单词结尾来对其进行限制。则不需要单独对其进行判断
全部代码如下:

class LoggingMiddleware(MiddlewareMixin):
    def process_request(self, request):
         拦截请求之前的函数
        判断是否处于登陆状态
         1.给request.user属性赋值,赋值为当前登陆系统的用户
        user_id = request.session.get('user_id')
        if user_id:
             拿到用户对象
            user = User.objects.filter(pk=user_id).first()
             请求中的用户属性改为当前登陆用户对象
            request.user = user
       2 .登陆校验,需区分哪些地址需要做登陆校验,哪些地址不需要做登陆校验
        path = request.path
        if path == '/':
             如果直接访问不带路由的地址(通常为主页),则不用进行强制登陆(也可在下面不用校验的集合中写成
            # '^/$‘,则此处不用写这个if语句)。
            return None
        不需要做登陆校验的地址
        not_need_check = ['/user/register/', '/user/login/', '/goods/index/',
                          '/goods/detail/.*/', '/cart/.*/']
        for check_path in not_need_check:
            if re.match(check_path, path):
                 当前path路径为不需要做登陆校验的路由,则直接访问对应页面
                return None
        if not user_id:
             path为需要做登陆校验的路由时,判断用户是否登陆,没有登陆则跳转到登陆页面
            return HttpResponseRedirect(reverse('user:login'))

相关文章

  • day54-天天生鲜项目订单管理

    1生成结算页面的相关数据 生成提交页面的商品种类及小计,总价等信息 寄送地址 所提交的商品详情页面 金额结算 aj...

  • Django天天生鲜项目

    一.项目的整体架构 二.用户模块 用户注册思路总结: 获取用户输入的信息(username,password,em...

  • 天天生鲜项目搭建

    1.项目架构 2. 数据库表结构 3.项目框架搭建 1.创建项目 2.创建多个应用 使用idea打开项目,然后将建...

  • 实用四招-提高服装行业小批量的生产能力

    一、加强生产订单管理 1、以项目管理引导订单管理 每一次生产都作为一个项目来看,加强对项目的成本、质量和工期管理,...

  • Django天天生鲜项目学习笔记

    首先分析数据库模型! 用户表: id, 用户名, 密码, 邮箱, 激活标志, 权限标识(是否管理员) 地址表 :...

  • Mysql笔记

    项目名称:天天生鲜 开发环境安装 系统:ubuntu 数据库:MySQL 安装 启动 停止 重启 允许远程连接找到...

  • 谊品生鲜:放弃传统数据库架构,全站上阿里云

    简介:本文转载自中国软件网,作者:曹开彬 疫情之下,生鲜电商的订单突然暴涨。 社区生鲜龙头企业谊品生鲜就是一个典型...

  • day53-Django项目-天天生鲜

    一、购物车数据同步模块 1.定义数据同步中间件 二、购物车功能模块 1.在urls.py配置文件中定义路由 2.计...

  • day54-Django项目-天天生鲜

    一、提交订单模块 1.在urls.py配置文件中定义路由 2.生成随机订单号 3.提交订单功能 4.前端页面代码 ...

  • day51-Django项目-天天生鲜

    一、注册模块 1.创建注册验证表单 2.注册功能 二、登录模块 1.创建登录验证表单 2.登录功能 三、中间件校验...

网友评论

      本文标题:day54-天天生鲜项目订单管理

      本文链接:https://www.haomeiwen.com/subject/mtgidqtx.html