Python毕业设计基于django的网上购物商城系统--Day1

商品模块:

  • 功能1.显示所有商品

  • 功能2.商品详情

功能1开发:

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 %}
​
​
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁的秋秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值