【Django3.0使用技巧】apps篇:通用简洁的文章内容API配置model、adminx

Django3.0中app的通用简洁的配置模板,这里以新闻CMS系统举例,根据自己的实际情况进行增减。

内容简介

基础数据模型的构建。

创建model应用模块

进入文件根目录执行命令创建应用。

cd TCM_ManageMent
python manage.py startapp articles

配置新闻应用模块

在settings.py文件中修改。

INSTALLED_APPS = [
	...
	# 添加文章应用
    'articles',

编写应用中的文件实现数据内容定义

不需要修改该的文件

  1. admin.py 这个我们使用xadmin代替的原有版本的admin,因此这个文件不需要修改该。
  2. apps.py 应用的配置文件,不需要动。
  3. 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)

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/110657761