赞
踩
功能1.显示所有商品
功能2.商品详情
1.创建新模块goods
python manage.py startapp goods
2.在项目包下的settings.py文件中添加模块
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'goods', 'User', 'cart', 'order' ]DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'jiukuaijiu', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123456', 'OPTIONS':{ 'init_command':"SET sql_mode='STRICT_TRANS_TABLES'", 'charset':'utf8' } } }
3.models.py文件中添加模型代码
class Category(models.Model): name = models.CharField(max_length=20,unique=True) def __unicode__(self): return u'%s'%self.name class Meta: verbose_name_plural='类别' ordering=['id'] class Goods(models.Model): name=models.CharField(max_length=100,verbose_name='商品名称') desc = models.CharField(max_length=100,verbose_name='商品描述') price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name='现价') oldprice=models.DecimalField(max_digits=5,decimal_places=2,verbose_name='原价') category=models.ForeignKey(Category) def __unicode__(self): return u'%s'%self.name class Meta: verbose_name_plural='商品' ordering=['id'] def getImg(self): return self.inventory_set.first().color.value def getColors(self): colors = [] for inventory in self.inventory_set.all(): color = inventory.color if color not in colors: colors.append(color) return colors def getSizes(self): sizes =[] for inventory in self.inventory_set.all(): size = inventory.size if size not in sizes: sizes.append(size) return sizes def getDetails(self): import collections datas = collections.OrderedDict() for detail in self.goodsdetailsitem_set.all(): dname = detail.name() if dname not in datas: datas[detail.name()]=[detail.values] else: datas[detail.name()].append(detail.values) return datas class Color(models.Model): name=models.CharField(max_length=20) value=models.ImageField(upload_to='media/color/') def __unicode__(self): return u'%s'%self.name class Meta: verbose_name_plural='颜色' ordering=['id'] class Size(models.Model): name=models.CharField(max_length=20) value=models.CharField(max_length=20) def __unicode__(self): return u'%s'%self.name class Meta: verbose_name_plural='尺寸' ordering=['id'] class GoodsDetails(models.Model): name=models.CharField(max_length=20) def __unicode__(self): return u'%s'%self.name class Meta: verbose_name_plural='详情' ordering=['id'] class GoodsDetailsItem(models.Model): goods = models.ForeignKey(Goods) goodsdetails=models.ForeignKey(GoodsDetails,verbose_name='详情') values=models.ImageField(upload_to='media/',verbose_name='图片') def name(self): return self.goodsdetails.name def __unicode__(self): return u'%s'%self.values class Meta: verbose_name_plural = '详细条目' ordering = ['id'] #库存表 class Inventory(models.Model): color = models.ForeignKey(Color) size = models.ForeignKey(Size) goods = models.ForeignKey(Goods) count=models.IntegerField(default=100) def __unicode__(self): return u'%s'%self.count class Meta: verbose_name_plural='库存' ordering=['id']
4.在Terminal中生成迁移文件并且创建数据库表
python manage.py makemigrations goods python manage.py migrate
5.将jiukuaijiu.json和init.py拷贝到项目中
6.通过运行test_model函数读取jiukuaijiu.json文件数据到商品模块数据库表中
7.思考:浏览器地址栏的访问路径 地址栏:http://127.0.0.1:8000访问到商城首页
8.在项目包的urls.py中添加映射路径
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'', include('goods.urls')), ]
9.在goods模块包下的urls.py中添加映射路径
#coding=utf-8 from django.conf.urls import url from . import views urlpatterns=[ url(r'^$',views.IndexView.as_view()), url(r'^category/(\d+)/page/(\d+)$',views.IndexView.as_view()), ]
10.在goods模块包中的views.py文件中添加代码
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render # Create your views here. from django.views import View from models import * from utils.pageutil import * class IndexView(View): categorys = Category.objects.all() current_categoryid = Category.objects.first().id def get(self,request,categoryid=None,pagenum=1): print pagenum if categoryid ==None: current_cid = self.current_categoryid else: current_cid = categoryid pages,goods = get_objects_page(Goods.objects.filter(category_id=current_cid),pagenum) # goods = Goods.objects.filter(category_id=current_cid) return render(request,'index.html',{'categorys':self.categorys,'current_cid':int(current_cid),'goods':goods,'pages':pages})
11.翻页工具函数拷贝到utils的Python package中
#coding=utf-8 from django.core.paginator import Paginator #分页工具函数 def get_objects_page(object_list=None,pagenum=1,perpage=12): pages = Paginator(object_list=object_list,per_page=perpage) pagenum = int(pagenum) if pagenum<1:pagenum = 1 if pagenum >pages.num_pages:pagenum = pages.num_pages page = pages.page(pagenum) return page,page.object_list
12.在goods模块包下的templates文件夹中完善index.html
{% extends 'base.html' %} {% load staticfiles %} {% block main %} <div class="classes"> <ul class="classes-items"> {% for category in categorys %} <li class="items{% if category.id == current_cid %} active {% endif %}"><a href="/category/{{ category.id }}">{{ category.name }}</a></li> {% endfor %} </ul> </div> <div class="goods-model"> <div class="goods-content"> {% for good in goods %} <div class="good"> <a href="/goodsdetails/{{ good.id }}"> <img src="{{ MEDIA_URL }}{{ good.getImg }}" width="285px" height="285px"> <p class="name">{{ good.name }}</p> <div class="price"> <i>¥</i> <p class="big">{{ good.price }}</p> <s>¥{{ good.oldprice }}</s> </div> <div class="sale"> 特卖 </div> </a> </div> {% endfor %} </div> </div> <div id="pager" style="text-align: center; font-size: 16px; overflow: hidden; margin-top: 10px;"> {% if pages.has_previous %} <a href="/category/{{ current_cid }}/page/{{ pages.previous_page_number }}" style="display: inline-block; padding: 5px; margin: 5px;">上一页</a> {% endif %} {% if pages.has_next %} <a href="/category/{{ current_cid }}/page/{{ pages.next_page_number }}" style="display: inline-block; padding: 5px; margin: 5px;">下一页</a> {% endif %} </div> {% endblock main %} {% block footerjs %} <script> $('#pager').css({'text-align':'center','font-size':'16px','overflow':'hidden','margin-top':'10px'}) $('#pager a').css({'display':'inline-block','padding':'5px','margin':'5px'}) </script> {% endblock footerjs %}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。