1. 创建视图函数
class RemenProductView(View):
def get(self, request, categoryId):
# Type类型Error错误: Object of type QuerySet查询结果集 is not 不是JSON serializable序列化
products = ProductSku.objects.filter(category_id=categoryId, is_shop=True).order_by("-sale_count")[0:3]
list = []
for pro in products:
list.append({"id": pro.id, "default_imgurl": pro.default_imgurl, "name": pro.name, "price": pro.price})
# print("====", list)
return JsonResponse({"code": 0, "msg": "获取成功", "products": list})
class ProductDetailView(View):
def get(self, request, skuId):
# 获取当前skuID商品的详细信息
prouctSku = ProductSku.objects.get(id=skuId)
data = {
"categories": product_category(),
"daohang": daohang(prouctSku.category),
"prouctSku": prouctSku,
}
return render(request, "product/productDetail.html", context=data)
2. 创建路由
urlpatterns = [
re_path(r'hotProduct/(?P<categoryId>\d+)/$', RemenProductView.as_view(), name="hotProduct"),
re_path(r'productDetail/(?P<skuId>\d+)/$', ProductDetailView.as_view(), name="productDetail"),
]
3. 创建productDetail.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>喵喵商城-商品详情</title>
<link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
<link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
<script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
<script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
<script type="text/javascript" src="{{ static('js/utils.js') }}"></script>
</head>
<body>
<div id="app">
<div class="header_con">
<div class="header" v-cloak>
<div class="welcome fl">欢迎来到喵喵商城</div>
<div class="fr">
<div class="login_btn fl" v-show="flag1">
欢迎您:<em>{[ username ]}</em>
<span>|</span>
<a href="{{ url('users:logout') }}">退出</a>
</div>
<div class="login_btn fl" v-show="flag2">
<a href="{{ url('users:login') }}">登录</a>
<span>|</span>
<a href="{{ url('users:zhuce') }}">注册</a>
</div>
<div class="user_link fl">
<span>|</span>
<a href="{{ url('users:userinfo') }}">用户中心</a>
<span>|</span>
<a href="">我的购物车</a>
<span>|</span>
<a href="">我的订单</a>
</div>
</div>
</div>
</div>
<div class="search_bar clearfix">
<a href="{{ url('shouye:index') }}" class="logo fl"><img src="{{ static('images/logo.png') }}"></a>
<div class="search_wrap fl">
<form method="get" action="/search/" class="search_con">
<input type="text" class="input_text fl" name="q" placeholder="搜索商品">
<input type="submit" class="input_btn fr" name="" value="搜索">
</form>
<ul class="search_suggest fl">
<li><a href="#">满199减100</a></li>
<li><a href="#">家装建材</a></li>
<li><a href="#">潮流家电</a></li>
<li><a href="#">华为新品</a></li>
</ul>
</div>
<div class="guest_cart fr">
<a href="" class="cart_name fl">我的购物车</a>
<div class="goods_count fl" id="show_count"></div>
<ul class="cart_goods_show">
<li>
<img src="" alt="商品图片">
<h4></h4>
<div></div>
</li>
</ul>
</div>
</div>
<div class="navbar_con">
<div class="navbar">
<div class="sub_menu_con fl">
<h1 class="fl">商品分类</h1>
<ul class="sub_menu">
{% for g in categories.values() %}
<li>
<div class="level1">
{% for yiji in g.channels %}
<a href="{{ yiji.url }}">{{ yiji.name }}</a>
{% endfor %}
</div>
<div class="level2">
<div class="list_group">
{% for category2 in g.sub_categorys %}
<div class="group_name fl">{{ category2.name }} ></div>
<div class="group_detail fl">
{% for category3 in category2.sub_categorys %}
<a href="/productList/{{ category3.id }}/1/">{{ category3.name }}</a>
{% endfor %}
</div>
{% endfor %}
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
<ul class="navlist fl">
<li><a href="">秒杀</a></li>
<li class="interval">|</li>
<li><a href="">拍卖</a></li>
<li class="interval">|</li>
<li><a href="">喵喵家电</a></li>
<li class="interval">|</li>
<li><a href="">喵喵超市</a></li>
<li class="interval">|</li>
<li><a href="">喵喵生鲜</a></li>
<li class="interval">|</li>
<li><a href="">喵喵国际</a></li>
</ul>
</div>
</div>
<div class="breadcrumb">
<a href="javascript:;">{{ daohang.category1.name }}</a>
<span>></span>
<a href="javascript:;">{{ daohang.category2.name }}</a>
<span>></span>
<a href="javascript:;">{{ daohang.category3.name }}</a>
</div>
<div class="goods_detail_con clearfix">
<div class="goods_detail_pic fl"><img src="http://yhcsxtest.yonghui.cn//wimages/894864/894864_main_1.jpg"></div>
<div class="goods_detail_list fr">
<h3>{{ prouctSku.name }}</h3>
<p>{{ prouctSku.fubiaoti }}</p>
<div class="price_bar">
<span class="show_pirce">¥<em>{{ prouctSku.price }}</em></span>
<a href="javascript:;" class="goods_judge"></a>
</div>
<div class="goods_num clearfix">
<div class="num_name fl">数 量:</div>
<div class="num_add fl">
<input v-model="count" @blur="check_count" type="text" class="num_show fl">
<a @click="jia" class="add fr">+</a>
<a @click="jian" class="minus fr">-</a>
</div>
</div>
<div class="type_select">
<label></label>
{# 选项 #}
</div>
<div class="operate_btn">
<a 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>
<li v-for="pro in products">
<a :href="pro.detailUrl"><img src="http://yhcsxtest.yonghui.cn//wimages/44788/main/44788_main_1657605282537.jpg"></a>
<h4><a :href="pro.detailUrl">{[ pro.name ]}</a></h4>
<div class="price">¥{[ pro.price ]}</div>
</li>
</ul>
</div>
</div>
<div class="r_wrap fr clearfix">
<ul class="detail_tab clearfix">
<li class="active">商品详情</li>
<li>规格与包装</li>
<li>售后服务</li>
<li>商品评论</li>
</ul>
<div class="tab_content">
<dl>
<dt>商品详情:</dt>
<dd></dd>
</dl>
</div>
<div class="tab_content">
<dl>
<dt>规格与包装:</dt>
<dd></dd>
</dl>
</div>
<div class="tab_content">
<dl>
<dt>售后服务:</dt>
<dd></dd>
</dl>
</div>
<div class="tab_content">
<ul class="judge_list_con">
<li class="judge_list fl">
<div class="user_info fl">
<img src="">
<b></b>
</div>
<div class="judge_info fl">
<div class="stars_five"></div>
<div class="judge_detail"></div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="footer">
<div class="foot_link">
<a href="#">关于我们</a>
<span>|</span>
<a href="#">联系我们</a>
<span>|</span>
<a href="#">招聘人才</a>
<span>|</span>
<a href="#">友情链接</a>
</div>
<p>CopyRight © 2018 北京*******有限公司 All Rights Reserved</p>
<p>电话:010-******* 京ICP备********号</p>
</div>
</div>
</body>
<script type="text/javascript">
let categoryId = "{{ prouctSku.category.id }}";
let kucun="{{ prouctSku.kucun }}"
</script>
<script type="text/javascript" src="{{ static('js/productDetatail.js') }}"></script>
</html>
4.创建productDetatail.js
var v = new Vue({
el: "#app",
delimiters: ["{[", "]}"],
data: {
username: "",
flag1: false, //展示用户名和退出
flag2: true, //展示注册和登陆
categoryId: categoryId,
products: "", //热门商品数据
count: 1,
kucun: kucun,
},
//页面加载完成后,自动调用
mounted() {
//从cookie里面读取用户名...可能会从cookie中读取很多数据-->编写一个工具js文件,写一个getcookie函数读取信息
this.username = getCookie("username");
if (this.username != undefined) {
this.flag1 = true;
this.flag2 = false;
} else {
this.flag1 = false;
this.flag2 = true;
}
//发送获取热门商品的请求
this.get_remen_product();
if (this.kucun == 0) {
this.count = 0;
//禁用代码,提示文案
}
},
methods: {
get_remen_product() {
if (this.categoryId) {
let path = "/hotProduct/" + this.categoryId + "/";
axios.get(path).then(resp => {
this.products = resp.data.products;
//给每一条sku加上商品详情连接跳转
for (let i = 0; i < this.products.length; i++) {
this.products[i].detailUrl = '/productDetail/' + this.products[i].id + "/";
}
}).catch(err => {
console.log(err)
})
}
},
check_count() {
if (this.count < 1) {
this.count = 1;
}
if (this.count > this.kucun) {
this.count = this.kucun;
}
},
jia() {
if (this.count < this.kucun) {
this.count++;
} else {
this.count = this.kucun;
alert("商品已达上限")
}
},
jian() {
if (this.count > 1) {
this.count--;
}
},
}
})