django搭建博客五系统模型建立与注册

该系列文章

django搭建博客一前言
django搭建博客二之初始化工程
django搭建博客三初始化应用
django搭建博客四页面布局和自定义异常视图
django搭建博客五系统模型建立与注册
django搭建博客六邮件模板和邮件工具类
django搭建博客七用户注册
django搭建博客八用户登录
django搭建博客九用户密码重置
django搭建博客十博客首页

建立模型

编辑\myblog\system\models.py

追加以下内容,以下文件内创建

  • 基本模型(所有模型的父类)
  • 用户模型
  • 邮件记录模型
from django.contrib.auth.models import AbstractUser
from django.db import models

import logging

logger = logging.getLogger('django')


"""
邮件类型
"""
class EmailType:
    ACTIVE = "active" 
    RESET = "reset"  
    NOTICE = "notice"
    CHECK = "check"
    REPLY = "reply"


EMAIL_TYPE = (
    (EmailType.ACTIVE, '注册激活'),
    (EmailType.RESET, '找回密码'),
    (EmailType.NOTICE, '评论通知'),
    (EmailType.CHECK, '评论审核'),
    (EmailType.REPLY, "评论回复"),
)


class BaseModel(models.Model):
    id = models.BigAutoField(verbose_name="ID", primary_key=True, editable=False, unique=True)
    creator = models.ForeignKey("system.User", verbose_name='创建者', on_delete=models.CASCADE, db_constraint=False,
                                related_name="%(app_label)s_creator_%(class)s", null=True, blank=True)
    editor = models.ForeignKey("system.User", verbose_name='编辑者', on_delete=models.CASCADE, db_constraint=False,
                               related_name="%(app_label)s_editor_%(class)s", null=True, blank=True)
    create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
    update_time = models.DateTimeField(verbose_name="更新时间", auto_now=True)

    class Meta:
        abstract = True
        default_manager_name = "admin_objects"

    @staticmethod
    def get_base_exclude_fields():
        return [BaseModel.deleted.field.name,
                BaseModel.creator.field.name,
                BaseModel.editor.field.name]


class User(AbstractUser, BaseModel):
    link = models.URLField(verbose_name='个人网址', null=True, blank=True)
    avatar = models.ImageField(verbose_name='头像', upload_to="avatar/", default="avatar/default.png")
    introduction = models.CharField(max_length=50, null=True, blank=True)
    nickname = models.CharField(verbose_name='昵称', max_length=100, null=True, blank=True)
    is_active = models.BooleanField(verbose_name="是否激活", default=True)

    class Meta(BaseModel.Meta):
        db_table = "sys_user"
        verbose_name = "用户"
        verbose_name_plural = verbose_name
        ordering = ['-last_login']

    def __str__(self):
        return self.username


class EmailRecord(BaseModel):
    receiver = models.ForeignKey(User, verbose_name="收件人", related_name="user_email_record", on_delete=models.CASCADE)
    url = models.URLField(verbose_name="访问url", null=True, blank=True)
    code = models.CharField(verbose_name="验证码", max_length=200)
    email_type = models.CharField(verbose_name="邮件类型", choices=EMAIL_TYPE, max_length=50)
    comment_id = models.BigIntegerField(verbose_name="评论Id", help_text="用来审核评论的", null=True, blank=True)

    class Meta:
        ordering = ("-create_time",)
        db_table = "sys_email_record"
        verbose_name = '邮件记录'
        verbose_name_plural = verbose_name

BaseModel是一个抽象的基本模型,包含每个模型的公共字段。后面所有的模型都会继承该抽象模型。system应用下提供用户模型邮件记录模型

接下来需要迁移模型,同样操作选择Tools->Run manage.py Task,操作如下图
在这里插入图片描述

在这里插入图片描述

或者在当前项目位置打开终端执行以下命令

python manage.py makemigrations
python manage.py migrate

注册模型

编辑\mybloh\system/admin.py

from django.contrib.admin import ModelAdmin, register, site
from system import models

site.site_header = '博客后台管理系统'
site.site_title = '博客后台管理系统'


class BaseModelAdmin(ModelAdmin):
    list_per_page = 10
    list_max_show_all = 10

    def get_exclude(self, request, obj=None):
        if not request.user.is_superuser:
            return models.BaseModel.get_base_exclude_fields()
        return None

    def save_model(self, request, obj, form, change):
        if change:
            obj.creator = request.user if not obj.creator else obj.creator
            obj.editor = request.user
        super(BaseModelAdmin, self).save_model(request, obj, form, change)


@register(models.User)
class UserModelAdmin(BaseModelAdmin):
    list_display = ['username', 'nickname', 'email', 'link', 'is_active', 'is_superuser']
    list_filter = ['username', 'email']
    search_fields = ['username', 'email']
    list_editable = ["is_active", "is_superuser"]
    list_per_page = 20



@register(models.EmailRecord)
class EmailRecordModelAdmin(BaseModelAdmin):
    list_display = ['id', 'email_type', 'receiver', 'url']
    list_filter = ['email_type', 'receiver__username']
    search_fields = ['receiver__username', 'receiver__email']

接下来需要创建超级用户,同样操作选择Tools->Run manage.py Task,操作如下图
在这里插入图片描述

或者在当前项目位置打开终端执行以下命令

python manage.py createsuperuser

接下来让我们启动项目访问后台http://127.0.0.1:8000/admin

输入我们刚刚创建的用户名和密码,成功返回以下页面表示ok

在这里插入图片描述

自定义登录验证

编辑\myblog\myblog\system\views.py

from django.db.models import Q
from django.contrib.auth import get_user_model
User = get_user_model()


"""
自定义用户登陆验证逻辑(实现用户名或邮箱登陆)
"""
class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user
        except User.DoesNotExist as e:
            return None

编辑\myblog\myblog\settings.py,添加以下配置

# 自定义认证后台
AUTHENTICATION_BACKENDS = ['system.views.CustomBackend']

这样配置完成后,可以再次访问admin后台,输入之前创建的邮箱+密码也可以登录成功了。

美化后台

django-simpleui 是一款django admin 的一个主题 ,基于element-ui+vue开发,可以让我们的后台管理系统看起来更好看。

新增\myblog\myblog\simpleui_settings.py

# 首页配置
# SIMPLEUI_HOME_PAGE = 'https://www.baidu.com'
# 首页标题
# SIMPLEUI_HOME_TITLE = '百度一下你就知道'
# 首页图标,支持element-ui的图标和fontawesome的图标
# SIMPLEUI_HOME_ICON = 'el-icon-date'

# 设置simpleui 点击首页图标跳转的地址
SIMPLEUI_INDEX = 'https://www.88cto.com'

# 首页是否显示服务器、python、django、simpleui相关信息
SIMPLEUI_HOME_INFO = False

# 首页显示快速操作
SIMPLEUI_HOME_QUICK = True

# 首页显示最近动作
SIMPLEUI_HOME_ACTION = True

# 自定义SIMPLEUI的Logo
# SIMPLEUI_LOGO = 'https://avatars2.githubusercontent.com/u/13655483?s=60&v=4'

# 登录页粒子动画,默认开启,False关闭
# SIMPLEUI_LOGIN_PARTICLES = False

# simpleui是否收集相关信息
SIMPLEUI_ANALYSIS = False

# 自定义simpleui 菜单
# SIMPLEUI_CONFIG = {
#     'system_keep': True,  # 在自定义菜单的基础上保留系统模块
#     'menus': [
#         {
#             'name': 'Simpleui',
#             'icon': 'fas fa-code',
#             'url': 'https://gitee.com/tompeppa/simpleui'
#         },
#         {
#             'name': '搜索引擎',
#             'icon': 'fa fa-list',
#             'models': [{
#                 'name': '百度',
#                 'url': 'http://baidu.com',
#                 'icon': 'fa fa-list'
#             }, {
#                 'name': '谷歌',
#                 'url': 'https://google.com',
#                 'icon': 'fa fa-list'
#             }]
#         }]
# }

# 是否显示默认图标,默认=True
# SIMPLEUI_DEFAULT_ICON = False

# 图标设置,图标参考:
# SIMPLEUI_ICON = {
#     '员工管理': 'fas fa-user-tie'
# }

# 指定simpleui 是否以脱机模式加载静态资源,为True的时候将默认从本地读取所有资源,即使没有联网一样可以。适合内网项目
# 不填该项或者为False的时候,默认从第三方的cdn获取
SIMPLEUI_STATIC_OFFLINE = True

# 默认主题 设置
SIMPLEUI_DEFAULT_THEME = 'x-blue.css'

编辑\myblog\myblog\settings.py,修改以下内容

....

INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'system'
]
....

from myblog.simpleui_settings import *

这里注册simpleui应用需要注意将 simpleui 注册到 INSTALLED_APPS 的放在第一个

美化后的效果图如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较大的问题,我会尽可能地简要地回答。首先,对于需求分析,你需要考虑以下几个方面: 1. 博客的功能要求:包括博客的基本功能(如发布文章、编辑文章、删除文章等)、用户权限管理、评论管理、搜索功能等。 2. 博客的设计要求:包括博客的整体设计(如主题、样式、排版等)、文章的分类、标签等。 3. 数据库的设计:包括数据库的表设计、数据表之间的关系、索引设计等。 对于数据库的设计,你可以考虑使用 Django 自带的 ORM(Object-Relational Mapping)框架,它可以帮助你更方便地操作数据库。 以下是一个简单的数据库表设计示例: ```python from django.db import models class Category(models.Model): name = models.CharField(max_length=100) class Tag(models.Model): name = models.CharField(max_length=100) class Post(models.Model): title = models.CharField(max_length=100) body = models.TextField() created_time = models.DateTimeField(auto_now_add=True) modified_time = models.DateTimeField(auto_now=True) excerpt = models.CharField(max_length=200, blank=True) category = models.ForeignKey(Category) tags = models.ManyToManyField(Tag, blank=True) ``` 在这个示例中,我们定义了三个数据表:Category、Tag 和 Post。Category 表和 Tag 表分别用于存储文章的分类和标签,Post 表用于存储文章的内容。其中,Post 表和 Category 表之间是一对多的关系,Post 表和 Tag 表之间是多对多的关系。 当你定义完数据表之后,可以使用 Django 的命令行工具来生成数据库表格: ``` python manage.py makemigrations python manage.py migrate ``` 这样,你就可以开始在 Django 中使用这些数据表了。 当然,这只是一个简单的示例,实际的博客系统可能会更复杂,你需要根据自己的需求进行设计。希望这些信息对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值