這是一個簡單的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