Django3.0中app的通用简洁的配置模板,这里以新闻CMS系统举例,根据自己的实际情况进行增减。
内容简介
基础数据模型的构建。
创建model应用模块
进入文件根目录执行命令创建应用。
cd TCM_ManageMent
python manage.py startapp articles
配置新闻应用模块
在settings.py文件中修改。
INSTALLED_APPS = [
...
# 添加文章应用
'articles',
编写应用中的文件实现数据内容定义
不需要修改该的文件
- admin.py 这个我们使用xadmin代替的原有版本的admin,因此这个文件不需要修改该。
- apps.py 应用的配置文件,不需要动。
- test.py 测试执行脚本,不需要动。
models.py
根据你的实际情况进行编辑设置对应表单、和业务模型。
# 文章类别管理
class ArticleCategory(models.Model):
category_name = models.CharField(max_length=20, verbose_name='文章类别名称', help_text="文章类别名称")
StatusChoices = (("1", "在用"), ("0", "未用"))
status = models.CharField(choices=StatusChoices, max_length=1, default=1, verbose_name='使用状态',
help_text="使用状态")
created_date = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
add_user = models.ForeignKey(User, related_name='ArticleCategoryAddUser', on_delete=models.CASCADE,
verbose_name='创建用户', help_text="创建用户")
class Meta:
verbose_name = '文章类别管理'
verbose_name_plural = verbose_name
def __str__(self):
return self.category_name
# 文章栏目管理
class ArticleItem(models.Model):
item_category = models.ForeignKey(ArticleCategory, on_delete=models.CASCADE, related_name='ArticleItemCategory',
verbose_name="文章类别", help_text="文章类别")
item_name = models.CharField(max_length=20, verbose_name="栏目名称", help_text="栏目名称")
StatusChoices = (("1", "在用"), ("0", "未用"))
status = models.CharField(choices=StatusChoices, max_length=1, default=1, verbose_name='使用状态',
help_text="使用状态")
created_date = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
add_user = models.ForeignKey(User, related_name='ArticleItemAddUser', on_delete=models.CASCADE,
verbose_name='创建用户', help_text="创建用户")
class Meta:
verbose_name = '文章栏目管理'
verbose_name_plural = verbose_name
def __str__(self):
return self.item_name
# 文章标签管理
class ArticleTag(models.Model):
tag_name = models.CharField(max_length=50, verbose_name='标签名称', help_text="标签名称")
tag_slug = models.SlugField(max_length=50, verbose_name="标签slug", help_text='填写英文、字母、下划线、数字,不可重复', unique=True)
StatusChoices = (("1", "在用"), ("0", "未用"))
status = models.CharField(choices=StatusChoices, max_length=1, default=1, verbose_name='使用状态',
help_text="使用状态")
created_date = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
add_user = models.ForeignKey(User, related_name='ArticleTagAddUser', on_delete=models.CASCADE,
verbose_name='创建用户', help_text="创建用户")
class Meta:
verbose_name = '文章标签管理'
verbose_name_plural = verbose_name
def __str__(self):
return self.tag_name
# 文章内容管理
class ArticleInfo(models.Model):
article_title = models.CharField(max_length=50, default="",
verbose_name='新闻标题', help_text="新闻标题")
article_item = models.ForeignKey(ArticleItem, related_name='ArticleInfoItem', on_delete=models.CASCADE,
verbose_name='文章栏目', help_text="文章栏目")
ai_type = models.CharField(max_length=20, verbose_name='AI分类', help_text="AI分类")
article_summary = models.TextField(verbose_name='文章摘要', help_text="文章摘要")
article_source = models.CharField(max_length=100, default="",
verbose_name='文章来源', help_text="文章来源")
article_key_words = models.CharField(max_length=300, default="",
verbose_name='文章关键词', help_text="文章关键词",
blank=True)
article_slug = models.SlugField(default="日期+ID的格式",
verbose_name='文章slug', help_text="文章slug",
primary_key=True)
article_author = models.ForeignKey(User, related_name='ArticleInfoAuthor', on_delete=models.CASCADE,
verbose_name='文章作者', help_text="文章作者",
null=True, blank=True)
article_tags = models.ManyToManyField(ArticleTag, related_name='ArticleInfoTags',
verbose_name='文章标签', help_text="文章标签",
null=True, blank=True)
article_publish_date = models.DateTimeField(default=timezone.now,
verbose_name='文章发布日期', help_text="文章发布日期")
article_cover_1 = models.ImageField(upload_to='Article_Cover/%Y/%m', default='Article_Cover/default.png',
verbose_name='文章自定义封面', help_text="文章自定义封面",
null=True, blank=True)
article_cover_2 = models.TextField(default="原创",
verbose_name="文章原文封面图片链接", help_text="文章原文封面图片链接",
null=True, blank=True)
article_url = models.TextField(default="原创",
verbose_name="文章原文链接", help_text="文章原文链接",
null=True, blank=True)
article_video_url = models.TextField(default="原创",
verbose_name="文章视频链接", help_text="文章视频链接",
null=True, blank=True)
province = models.CharField(max_length=20, verbose_name='省市', help_text="省市")
city = models.CharField(max_length=20, verbose_name='城市', help_text="城市")
praise_num = models.IntegerField(default=0, verbose_name='点赞数', help_text="点赞数")
read_num = models.IntegerField(default=0, verbose_name='浏览数', help_text="浏览数")
fav_num = models.IntegerField(default=0, verbose_name='收藏数', help_text="收藏数")
StatusChoices = (("0", "未审核"), ("1", "已审核"), ("2", "审核不通过"))
status = models.CharField(choices=StatusChoices, max_length=1, default=0,
verbose_name='审核状态', help_text="审核状态")
created_date = models.DateTimeField(default=timezone.now,
verbose_name='创建时间', help_text='创建时间')
class Meta:
verbose_name = '新闻基础信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.article_title
# 文章详情管理
class ArticleDetail(models.Model):
detail_slug = models.SlugField(default="日期+ID的格式",
verbose_name='文章slug', help_text="文章slug",
primary_key=True)
detail_content = UEditorField('内容正文', height=400, width=800, default='', toolbars='besttome',
imagePath="ArticleDetailImages/%Y/%m", filePath='ArticleDetailFile/%Y/%m',
null=True, blank=True)
class Meta:
verbose_name = '文章详情'
verbose_name_plural = verbose_name
def __str__(self):
return self.detail_slug
# 文章基础信息和详情拼接
class Articles(ArticleInfo, ArticleDetail):
class Meta:
verbose_name = '新闻编辑内容'
verbose_name_plural = verbose_name
def __str__(self):
return self.article_title
adminx.py
from .models import *
from users.models import UserProfile
from xadmin.layout import Fieldset
from xadmin import views
import xadmin
from django.contrib.auth.forms import (UserCreationForm, UserChangeForm,
AdminPasswordChangeForm, PasswordChangeForm)
from django.contrib.auth.forms import UserCreationForm, UsernameField
from django.contrib.auth import get_user_model
# 全局设置 主题功能开启
class BaseSetting(object):
enable_themes = True
use_bootswatch = True
# 菜单设置
class GlobalSettings(object):
site_title = "新闻管理系统" # 设置站点标题
site_footer = "主页" # 设置站点的页脚
menu_style = "accordion" # 设置菜单折叠
def get_site_menu(self):
return (
{
'title': '新闻内容管理', 'menus': (
{
'title': '新闻大类管理', 'url': self.get_model_url(ArticleCategory, 'changelist')},
{
'title': '文章栏目管理', 'url': self.get_model_url(ArticleItem, 'changelist')},
{
'title': '新闻Tag管理', 'url': self.get_model_url(ArticleTag, 'changelist')},
{
'title': '全部编辑管理', 'url': self.get_model_url(Articles, 'changelist')},
)},
)
# 文章类别
class ArticleCategoryAdmin(object):
list_display = ['id', 'category_name', 'item_count', 'status', 'add_user', 'created_date']
show_bookmarks = False
# 统计每个Category下的Item数
def item_count(self, obj):
return ArticleItem.objects.filter(item_category=obj).count()
item_count.short_description = "栏目数量"
# 文章栏目
class ArticleItemAdmin(object):
list_display = ['item_category', 'item_name', "article_count", 'status', 'add_user', 'created_date']
show_bookmarks = False
# 统计每个Item下的文章数量
def article_count(self, obj):
return ArticleInfo.objects.filter(article_item_id=obj).count()
article_count.short_description = "文章数量"
# 文章标签
class ArticleTagAdmin(object):
list_display = ['tag_name', 'tag_slug', 'status', 'add_user', 'created_date']
show_bookmarks = False
# 定义文章信息合并后
class ArticlesAdmin(object):
list_display = ['article_title', 'status', 'article_item', 'article_source', 'created_date']
style_fields = {
"detail_content": "ueditor"}
show_bookmarks = False
list_per_page = 30
def instance_forms(self):
super().instance_forms()
if self.request.user.user_role not in ["Root", "ReviewUser"]:
self.form_layout = (Fieldset(None, 'status', **{
"style": "display:None"}),)
xadmin.site.register(views.CommAdminView, GlobalSettings) # 全局设置加载
xadmin.site.register(views.BaseAdminView, BaseSetting) # 注册主体风格切换
xadmin.site.register(ArticleCategory, ArticleCategoryAdmin)
xadmin.site.register(ArticleItem, ArticleItemAdmin)
xadmin.site.register(ArticleTag, ArticleTagAdmin)
xadmin.site.register(Articles, ArticlesAdmin)