IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django项目:极致果蔬(四) -> 正文阅读

[Python知识库]Django项目:极致果蔬(四)

本文继续完成项目的内容,下面完成的是用户浏览记录。

1.用户浏览记录

? ?在本项目中,当用户每次浏览商品详情时,会向后台发送请求,此时可携带商品ID,然后在Redis数据库中进行存储信息,此时可缓存用户ID和浏览商品的ID,并以浏览商品时间先后顺序进行排序,就可以实现存储用户浏览历史记录。

? ?此外,我们可以使用Redis数据库的列表来存储商品浏览记录,以用户ID 为key,分别存入商品信息,添加商品历史浏览记录时,用户最新浏览的商品的id从列表左侧默认插入。

? ?首先,创建一个超级管理员,在goods中的每一个应用里的admin.py中注册模型,在后台显示字段;

from django.contrib import admin
from .models import *

# Register your models here.
class GoodsSKUBeanAdmin(admin.ModelAdmin):
    list_display = ['id','name','price','unit','surplus','sale_count','image','status']
    list_display_links = ['name']
    list_editable = ['price','unit','surplus','sale_count']

class GoodsKindBeanAdmin(admin.ModelAdmin):
    list_display = ['id','name','logo','image']

class GoodsSPUBeanAdmin(admin.ModelAdmin):
    list_display = ['id','name','detail']

admin.site.register(GoodsSKUBean,GoodsSKUBeanAdmin)
admin.site.register(GoodsKindBean,GoodsKindBeanAdmin)
admin.site.register(GoodsSPUBean,GoodsSPUBeanAdmin)

? ?在后台添加商品种类,种类logo是一张‘雪碧图’,因此可以切换class来实现图标的定位;

?

? ?接下来,要获取浏览商品记录,则需要用户访问商品详情后,获取相应的GoodSKUBean值(如name、price等)即可,在user/views.py中的UserInfoView类视图中,获取浏览商品记录,并传递给模板;

class UserInfoView(View):
    def get(self,request):
        user = request.user
        try:
            default_address = AddressBean.objects.get(user=user,is_default=1,is_delete=0)
        except:
            default_address = None

        # 获取最近浏览的商品
        # 获取连接对象  把用户浏览记录放入到redis中
        conn = get_redis_connection("default")
        # 构造存储浏览记录的key
        historykey = f"history_{user.id}"
        # 根据key获取最新的5条skuid列表
        skuids = conn.lrange(historykey,0,4)
        # 根据每一个skuid查询相应的产品信息
        goodsSkuList = []
        for skuid in skuids:
            goodsSku = GoodsSKUBean.objects.get(id=skuid)
            goodsSkuList.append(goodsSku)

        return render(request,'user_center_info.html',
                      {'page':'info',
                       'default_address':default_address,
                       'goodsSkuList':goodsSkuList
                       })

? ?再在用户中心的个人信息下的模板文件 user_center_info.html 中进行页面渲染,显示数据;

{% if goodsSkuList %}
    <h3 class="common_title2">最近浏览</h3>
    <div class="has_view_list">
        <ul class="goods_type_list clearfix">
            {% for goodsSku in goodsSkuList %}
		    <li>
			    <a href="/detail/{{ goodsSku.id }}"><img src="/media/{{ goodsSku.image }}"></a>
			    <h4><a href="/detail/{{ goodsSku.id }}">{{ goodsSku.name }}</a></h4>
				<div class="operate">
				    <span class="prize">{{ goodsSku.price }}</span>
					<span class="unit">{{ goodsSku.price }}{{ goodsSku.unit }}</span>
					<a href="#" class="add_goods" title="加入购物车"></a>
				</div>
            </li>
            {% endfor %}
	    </ul>
    </div>
{% endif %}

? ? 效果如下:

? ??

? ? 若要添加用户访问商品详情页面的浏览记录,则需要让用户中心的个人信息显示出最近浏览商品的信息,这里我们需要在goods中实现访问商品详情页,在goods/views.py文件中创建DetailView类视图;

class DetailView(View):
    def get(self,request,skuId):
        user = request.user
        # 详情页的数据:登录用户和匿名用户都是可以访问的,但是只有登录用户需要取记录浏览记录
        # 登录用户浏览记录的缓存  
        if user.is_authenticated:
            # 缓存用户的浏览记录
            # 获取连接对象
            conn = get_redis_connection("default")
            # 构造存储浏览记录的key
            historykey = f"history_{user.id}"
            # 移除对应的skuId在缓存中的记录
            conn.lrem(historykey,0,skuId)
            # 将skuId重新添加到用户浏览记录缓存中
            conn.lpush(historykey,skuId)
            # 只保存记录中最新的五条数据-截取
            conn.ltrim(historykey,0,4)
        return render(request,'detail.html')

? ?设置分路由;

url(r'^detail/(?P<skuId>\d+)',DetailView.as_view(),name='detail'),

? ?主路由中的设置;

url(r'^goods/', include('apps.goods.urls')),

? ?访问详情页即可在用户中心处的个人信息中查看浏览记录;

? ?

2.上下文处理器

? ?这里我们补充一个知识点,上下文处理器是可以返回一些数据,在局部中可以用,在全局模板中也可以使用。比如登录后的用户信息,在很多界面中都需要使用,那么我们可以放在上下文处理器中,就不需要在每个视图函数中都返回这个对象。

? ?上下文处理器的存放位置?

? ?可以根据上下文处理器是属于哪个app的,然后在这个app中创建一个文件用于存储上下文处理器。比如context_processors.py。或者是你也可以专门创建一个Python包,用来存储所有的上下文处理器。

? ?上下文处理器的使用

? ?在定义的上下文处理器文件中,定义一个函数,这个函数只有一个request参数。这个函数中处理完自己的逻辑后,把需要返回给模板的数据,通过字典的形式返回。如果不需要返回任何数据,也必须返回一个空的字典。

? ?案例:

? 自定义用户登录注册系统时,登录后将用户名放入session中,但是需要在每个页面获取用户的姓名,如果在每一个视图里面写获取逻辑会很麻烦,不利于代码的维护,可以设置全局上下文,获取session中的用户名的值。
?? 在user应用下建立context_processors.py,并在settings.py中引入这个上下文变量;

def getUser(request):
   		 user_name = request.session.get('user_name',None)
   		 return {'user_name': user_name}
'context_processors': [
                	'django.template.context_processors.debug',
               	 	'django.template.context_processors.request',
                	'django.contrib.auth.context_processors.auth',
               		'django.contrib.messages.context_processors.messages',
              		'user.context_processors.getUser'
            	    ],

? ?到此,在所有模板中都可以访问这个变量。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:02:37  更:2022-01-03 16:02:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:27:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码