1、用户类
没有继承django自带的User类
头像使用了StdImageField,可自动生成缩略图
重写save方法进行密码加密
模型中省略了部分字段
from stdimage.models import StdImageField
from hashlib import sha1
class UserInfo(models.Model):
SEX_CHOICES = (
('0', '女'),
('1', '男'),
('-1', '保密')
)
# xadmin后台使用form表单的功能,字段默认blank=False
# 可以不填的字段需要加blank=True,blank是django层面的限制,跟数据库无关
username = models.CharField(max_length=128, verbose_name='用户名', unique=True)
password = models.CharField(max_length=128, verbose_name="密码")
nickname= models.CharField(max_length=128, verbose_name='昵称', blank=True)
# 访问原图:object.avatar.url,访问缩略图:object.avatar.thumbnail.url
avatar = StdImageField(
max_length=128,
upload_to='user/%Y/%m',
verbose_name="用户头像",
variations={'thumbnail': {'width': 100, 'height': 100}}, # 设置生成缩略图自适应的像素尺寸
default='user/default.png',
blank=True
)
# choise 后台显示一个下拉菜单
sex = models.CharField(verbose_name='性别', choices=SEX_CHOICES, default='-1', max_length=16)
date_joined = models.DateTimeField(verbose_name="注册时间", auto_now_add=True, editable=False)
# 对数据库的约束null默认未false
last_login = models.DateTimeField(verbose_name="最近登陆", blank=True, null=True)
is_active = models.BooleanField(verbose_name='有效', default=True)
class Meta:
verbose_name = "用户信息表"
verbose_name_plural = verbose_name
# ordering = ['sales_volume']
# db_table = 'UserInfo'
# 重写save方法,对密码进行加密
def save(self, *args, **kwargs):
if self.password:
s1 = sha1()
s1.update(self.password.encode())
self.password = s1.hexdigest()
super().save(*args, **kwargs)
def __str__(self):
return self.username
2.文件,图片上传处理
商品信息的模型
定义了对上传文件重命名的方法
模型类中自定义方法,可在xadmin后台中直接显示使用
模型中定义类方法,可直接使用类名调用
外键,DecimalField
from stdimage.models import StdImageField
# 处理上传图片名的函数
def handle_upload_name(instance, filename):
# 通过判断父类进行路径赋值
if isinstance(instance, GoodsType):
base_path = 'goods/type'
else:
base_path = 'goods'
ext = filename.split('.')[-1]
new_filename = "%s.%s" % (uuid.uuid1(), ext)
path = os.path.join(base_path, '%Y', '%m', new_filename)
return time.strftime(path)
class GoodsInfo(models.Model):
name = models.CharField(max_length=128, verbose_name='商品名称')
image = StdImageField(
max_length=128,
upload_to=handle_upload_name,
verbose_name="商品图片",
variations={'thumbnail': {'width': 100, 'height': 75}}, # 设置生成缩略图自适应的像素尺寸
)
introduce = models.CharField(max_length=258, verbose_name="商品简介")
price = models.DecimalField(verbose_name='单价', decimal_places=2, max_digits=7, null=False)
# help_text
unit = models.CharField(max_length=128, verbose_name="单位", null=False, help_text="500g、1只或者1箱等等")
sales_volume = models.IntegerField(default=0, verbose_name='销量', editable=False)
goods_type = models.ForeignKey(GoodsType, verbose_name="商品类别", on_delete=models.CASCADE)
# 手动设置是否为推荐产品
is_recommend = models.BooleanField(default=False, verbose_name='人气力荐')
stock = models.IntegerField(verbose_name='库存数量')
is_on_sale = models.BooleanField(verbose_name='在售', default=True)
# 自定义属性,可以在注册后台的时候使用,也可以写在后台里
def image_img(self):
return '<a href="%s" target="_blank"><img src="%s" /></a>' % (self.image.url, self.image.thumbnail.url)
image_img.short_description = '图片'
image_img.allow_tags = True # 加了这个后台才会渲染返回的html标签,否则当字符串处理
@classmethod
def get_recommend_goods(cls):
return cls.objects.filter(is_recommend=True, is_on_sale=True)
3.模型中定义3种类方法
https://blog.csdn.net/weixin_43667990/article/details/90815572
StdImageField用法参考:https://www.cnblogs.com/yoyoketang/p/10655601.html