项目settings.py中
#DeBug = False 是生产环境,一般情况都使用这种环境 如果为true那么就会把出错的代码显示
DEBUG = False
# DeBug如果为False还需要
# python manage.py collectstatic 将admin的所有js css文件拷贝到一个static文件夹中,不然登录admin时候就没有样式和功能
# 同时建立一个static文件夹用来存放我们的js css文件以及admin自带的css js文件
#指定静态文件的存储路径并创建static文件夹
#使用python manage.py collectstatic 将admin的前端文件导入到static中这样admin后端管理系统就可以使用了
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 设置session 在cookie中保存的sessionid 时间
SESSION_COOKIE_AGE = 60*60*24
# 设置关闭浏览器就删除session
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
#指定任何位置的地址都能访问
ALLOWED_HOSTS = ["*"]
#自己定义的app需要在这里注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'maing'
]
#用中文显示
LANGUAGE_CODE = 'zh-hans'
#用中国时间
TIME_ZONE = 'Asia/Shanghai'
当然如果使用Debug = True的时候:
仅需要在settings.py 中添加
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
在项目主url.py中配置
#Debug=False 后python manage.py collectstatic后需要手动指定路径
re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),
#指定admin后台管理的静态访问路径
re_path(r'^main/', include('maing.urls')),
需要导入的模块
from django.conf import settings
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
配置单独app项目时需要注意的:
首先要python manage.py startapp xxxx # xxxx自定义名字
在该app的modules.py中
以Goods为例
由于图片在添加后,如果再次添加则不会删除原图,所以用到了Django信号来处理该事件
class Goods(models.Model):
#商品
#商品名称
name = models.CharField(max_length=50, verbose_name="商品名称")
#所属类别
belong = models.ForeignKey(GoodsType, verbose_name="商品类型", on_delete=models.CASCADE)
#数量
num = models.IntegerField(verbose_name="数量")
#价格 共七位 二位小数
price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name="价格")
#商品图片 null=Ture 即使不传图片,也不用上传新图
picture = models.ImageField(verbose_name="商品图片", upload_to="static/upload/goods", null=True)
#描述
decs = models.TextField(verbose_name="简述")
class Meta:
verbose_name = "商品"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
#该商品删除则在删除动作之前删除对应图片
@receiver(post_delete, sender=Goods)
def delete_upload_files(sender, instance, **kwargs):
# 在后台管理 删除该使用者时候,对应的文件也删除
delphoto = getattr(instance, 'picture', '')
photopath = os.path.join(settings.MEDIA_ROOT, str(delphoto))
if os.path.exists(photopath):
os.remove(photopath)
@receiver(pre_save, sender=Goods)
def img_to_change(sender, instance, **kwargs):
# 点击保存前进行该业务处理
# 后台管理的img图片原来路径的获取
classify_s = Goods.objects.filter(id=instance.id)
#先判断,如果可以得到图片说明是修改图片业务,否则就是保存业务
if classify_s:
oldimgpath = str(classify_s[0].picture)
newimgpath = str(instance.picture)
# 比对两个路径所对应图片是否一致
# 如果不一致那么就把旧路径的图片删除
if newimgpath != oldimgpath:
os.remove(os.path.join(settings.MEDIA_ROOT, str(oldimgpath)))
在admin.py中配置
admin.site.site_header = "蓝庆库存管理"# 这样就能指定管理名字是什么 而不是默认的Django管理了
创建的app中的url一般这样写
re_path 第二个参数是我们views中的定义的def method
urlpatterns += [
#刷主页面的商品和商品类型
re_path(r"^goodsandtypes/", goodstype),
re_path(r"getmainpagemax/", getmainpagemax),
re_path(r"moregoods/", moregoods),
re_path(r"othergoods/", othergoods),
]
一些其他的功能
"""
用来自定义我们的Decimal转Json的类
由于Decimal在转json时候会有异常所以需要改类存在,这样在json.dumps()时候就能正常转换
"""
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
super(DecimalEncoder, self).default(o)
调用时候在视图中
dic 是我们自己封装的数据可以是列表可以是字典
json.dumps(dic, cls=DecimalEncoder)
# 每一个goods 由于和goodstype发生外键关系,所以goodstype必须通过get然后利用goods_set方法得到对应的唯一外键的goods
mtype = GoodsType.objects.get(name=types)
# 根据id查询到所有goods
mygoods = mtype.goods_set.get_queryset().order_by("price")
按照 price 排序 找到 name price picture 字段
goodsobj = gtobj.goods_set.values("name", "price", "picture").order_by("price")
gtobj.goods_set.values_list() 可以直接得到列表形式
手动添加一个csrftoken
from django.middleware.csrf import get_token, rotate_token
def display(request):
# 返回主页面
# 手动添加一个csrftoken 否则post请求就会是403
get_token(request) # 两者选一
mycookies = request.COOKIES
print("我的cookie是", mycookies)
# rotate_token(request) # 此方法每次设置新的cookies
return render(request, "display.html")