zoukankan      html  css  js  c++  java
  • Django 实现购物车功能

      购物车思路:使用 session 功能识别不同浏览器用户,使得用户不管是否登录了网站,均能够把想要购买的产品放在某个地方,之后随时可以显示或修改要购买的产品,等确定了之后再下订单,购物车可以用来暂存商品。

      我们可以使用 session 为每一个用户创建一个 ID,然后以这个 ID 作为创建每一个购物车的依据。这个购物车在用户浏览过程中会保留数据,一直到实际完成下单,用户执行清除,或者关闭浏览器为止,当然,退出登录的话购物车内容也会消失不见。

    在 settings.py 文件中加入下列语句,表示要求在浏览器一关闭的时候 session 就会失效。

    SESSION_EXPIRE_AT_BROWSER_CLOSE = True

    购物车的具体实现已经有现成的模块 django-cart 可以使用,详细用法可以参考 GitHub:https://github.com/bmentges/django-cart 。执行安装。

    pip install django-cart

    安装完成后我们在 settings.py 文件中 INSTALL_APPS 中加入 'cart' 模块。并执行 ./manage.py migrate 更新数据库。

    在 urls.py 中增加3个网站样式,分别用来执行购物车的增加产品,删除产品以及查看购物车。

    url(r'^cart/$', views.cart),
    url(r'^additem/(d+)/(d+)/$', views.add_to_cart, name='additem-url'),
    url(r'^removeitem/(d+)/$', views.remove_from_cart, name='removeitem-url'),

    我们编写 add_to_cart 函数,调用 django-cart 模块的 Cart 类,实现增加产品功能。

    from cart.cart import Cart
    def add_to_cart(request, product_id, quantity):
        product = models.Product.objects.get(id=product_id)
        cart = Cart(request)
        cart.add(product, product.price, quantity)
        return redirect('/')

    这里记得将 cart.py 中的 import models 改为 from . import models ,否则 Python 会找不到这个模块,报错。

    删除产品。

    def remove_from_cart(request, product_id):
        product = models.Product.objects.get(id=product_id)
        cart = Cart(request)
        cart.remove(product)
        return redirect('/cart/')

    显示购物车内容。

    @login_required
    def cart(request):
        all_categories = models.Category.objects.all()
        cart = Cart(request)
        template = get_template('cart.html')
        html = template.render(context=locals(), request=request)
        return HttpResponse(html)

    购物车的 html 文件 cart.html 。

    <!-- cart.html (mshop project) -->
    {% extends "base.html" %}
    {% block title %}查看购物车{% endblock %}
    {% block content %}
    <div class='container'>
    {% for message in messages %}
        <div class='alert alert-{{message.tags}}'>{{ message }}</div>
    {% endfor %}
        <div class='row'>
            <div class='col-md-12'>
                <div class='panel panel-default'>
                    <div class='panel-heading' align=center>
                        <h3>欢迎光临迷你小电商</h3>
                            {% if user.socialaccount_set.all.0.extra_data.name %}
                                {{user.socialaccount_set.all.0.extra_data.name}}<br/>
                                <img src='{{user.socialaccount_set.all.0.get_avatar_url}}' width='100'>
                            {% else %}
                                Welcome: {{ user.username }}
                            {% endif %}
                    </div>
                </div>
            </div>
        </div>
        <div class='row'>
            <div class='col-sm-12'>
                <div class='panel panel-info'>
                    <div class='panel panel-heading'>
                        <h4>我的购物车</h4>
                    </div>
                    <div class='panel panel-body'>
                        {% for item in cart %}
                        {% if forloop.first %}
                        <table border=1>
                            <tr>
                                <td width=300 align=center>产品名称</td>
                                <td width=100 align=center>单价</td>
                                <td width=100 align=center>数量</td>
                                <td width=100 align=center>小计</td>
                                <td width=100 align=center>删除</td>
                            </tr>
                        {% endif %}
                            <div class='listgroup'>
                                <div class='listgroup-item'>
                                    <tr>
                                        <td>{{ item.product.name }}</td>
                                        <td align=right>{{ item.product.price }}</td>
                                        <td align=center>{{ item.quantity }}</td>
                                        <td align=right>{{ item.total_price }}</td>
                                        <td align=center>
                                            <a href='{% url "removeitem-url" item.product.id %}'><span class='glyphicon glyphicon-trash'></span></a>
                                        </td>
                                    </tr>
                                </div>
                            </div>
                        {% if forloop.last %}
                        </table>
                        <button class='btn btn-warning'><a href='/order'>我要订购</a></button>
                        {% endif %}
                        {% empty %}
                            <em>购物车是空的</em>
                        {% endfor %}
                    </div>
                    <div class='panel panel-footer'>
                        总计:{{ cart.summary }}元
                    </div>
                </div>
            </div>
        </div>
    </div>
    {% endblock %}

    显示如下:

    至此,我们便完成了购物车功能,接下来可以实现订单功能,付款功能等等。

  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/weixuqin/p/9358093.html
Copyright © 2011-2022 走看看