这是一个简单的django admin 管理后台,这个应用案例主要是给运营人员进行填写数据
主要功能包括:
上传图片功能【选择上传时可以预览】【替换已有数据中的图片时可以预览新旧图片】
每条数据都将会记录操作历史。记录操作人是谁?修改内容是什么?并且定位责任到某一员。
这里的配置符合
可维护性、可扩展性以及数据库的性能,同时确保满足运营人员的需求。
Django 框架的最佳实践以及网站运营的实际场景。
列表展示页面
每条数据的修改历史记录页面
添加新数据时的页面
修改已有数据时的页面
1:包含文件
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/models.py
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/admin.py
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/apps.py
/home/luichun/lc/Pyfile/Pywebback/app/app/settings.py
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/templatetags/websitecontent_extras.py
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/templates/websitecontent/admin/test2.html
/home/luichun/lc/Pyfile/Pywebback/app/static/admin/css/websitecontent_image_preview.css
/home/luichun/lc/Pyfile/Pywebback/app/static/admin/js/websitecontent1_image_preview.js
/home/luichun/lc/Pyfile/Pywebback/app/websitecontent/models.py
# import os
# 因为需要上传【图片】【视频】【其它文件】,所以需要导入 os 模块 来处理文件路径# from datetime import datetime
# 需要导入 datetime 模块 来处理文件的时间from django.db import modelsfrom django.core.exceptions import ValidationError
#--功能1--添加验证文件大小功能,限制上传文件的大小from django.core.validators import FileExtensionValidator,URLValidator
#--功能2--添加验证文件类型功能,限制上传文件的类型--适用字段【image6】
# from django.core.validators import URLValidator
#--功能3--添加验证文件大小功能,限制上传文件的大小from django.conf import settings
# 引用 settings.AUTH_USER_MODEL 用于外键字段(created_by, updated_by)。from django.utils.translation import gettext_lazy as _# 【添加历史操作记录1】
# 导入 simple_history 的 HistoricalRecords
from simple_history.models import HistoricalRecords#--功能1--【代码块1】添加验证文件大小功能,限制上传文件的大小
def validate_file_size(value):filesize = value.sizeif filesize > 20971520: # 限制文件大小为20MBraise ValidationError(_("最大文件大小为20MB"))
#--功能1--【代码块1】添加验证文件大小功能,限制上传文件的大小# 设置上传图片的过滤条件变量,供后续 image1--image6 字段使用
IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif']
IMAGE_VALIDATORS = [validate_file_size, FileExtensionValidator(allowed_extensions=IMAGE_EXTENSIONS)]class WebsiteContent(models.Model):"""网站内容模型,用于存储运营人员可编辑的页面内容。"""# 基本字段id = models.AutoField(primary_key=True, verbose_name=_("ID"))page_location = models.CharField(max_length=255,verbose_name=_("页面位置描述"),help_text=_("如:首页Banner、关于页面等"),blank=True,null=True,)image6 = models.ImageField(upload_to='websiteimages/',verbose_name=_("填充对应的位置图片"),help_text=_("这个是本条数据填充到网页对应位置的示范截图,请根据实际位置上传对应的截图"),validators=IMAGE_VALIDATORS,null=True,blank=True)remark1 = models.CharField(max_length=255, verbose_name=_("备注1"), blank=True, null=True)remark2 = models.CharField(max_length=255, verbose_name=_("备注2"), blank=True, null=True)remark3 = models.CharField(max_length=255, verbose_name=_("备注3"), blank=True, null=True)remark4 = models.CharField(max_length=255, verbose_name=_("备注4"), blank=True, null=True)created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("创建时间"))updated_at = models.DateTimeField(auto_now=True, verbose_name=_("最后修改时间"))created_by = models.ForeignKey(settings.AUTH_USER_MODEL,# on_delete=models.PROTECT 确保创建人记录不会被意外删除on_delete=models.PROTECT,related_name='created_contents',verbose_name=_("创建人"),)updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,# on_delete=models.SET_NULL 允许修改人用户被删除后,该字段设置为NULon_delete=models.SET_NULL,related_name='updated_contents',verbose_name=_("最后修改人"),null=True,blank=True,)# 页面文本字段及URLtext1 = models.CharField(max_length=255, verbose_name=_("字段1"), blank=True, null=True)text1_url = models.URLField(max_length=500, verbose_name=_("字段1 URL"), blank=True, null=True,)text2 = models.CharField(max_length=255, verbose_name=_("字段2"), blank=True, null=True)text2_url = models.URLField(max_length=500, verbose_name=_("字段2 URL"), blank=True, null=True,)text3 = models.CharField(max_length=255, verbose_name=_("字段3"), blank=True, null=True)text3_url = models.URLField(max_length=500, verbose_name=_("字段3 URL"), blank=True, null=True,)text4 = models.CharField(max_length=255, verbose_name=_("字段4"), blank=True, null=True)text4_url = models.URLField(max_length=500, verbose_name=_("字段4 URL"), blank=True, null=True,)text5 = models.CharField(max_length=255, verbose_name=_("字段5"), blank=True, null