# Django-big-event **Repository Path**: windstarry/Django-big-event ## Basic Information - **Project Name**: Django-big-event - **Description**: 使用Django-ninja搭建的黑马程序员大事件的后端 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2023-12-26 - **Last Updated**: 2024-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用django-ninja搭建黑马程序员大事件系统的后端 ## 一、配置django项目 django常用的命令行 ```shell # 创建项目 django-admin startproject # 创建应用 python manage.py startapp # 启动django项目 python manage.py runserver # 收集静态文件 python manage.py collectstatic # 数据库迁移 python manage.py makemigrations python manage.py migrate # 创建超级用户 python manage.py createsuperuser # 创建指定用户名的超级用户 python manage.py createsuperuser --username # 初始化数据 python manage.py ``` ### 1.1 创建项目文件夹 ```shell django-admin startproject big_event ``` ### 1.2 创建虚拟环境 ```shell cd big_event python -m venv venv ``` ### 1.3 在虚拟环境中安装相关依赖 ```shell venv\scripts\activate.ps1 pip install django django-ninja ``` ### 1.4 运行项目 ```shell python manage.py runserver ``` ### 1.5 设置中文显示 big_event/settings.py中修改语言和时区 ```python LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' ``` ### 1.6 配置nijia静态路由 big_event文件夹下创建api.py文件,创建第一个接口 ```python from ninja import NinjaAPI app = NinjaAPI(title="BigEvent后端管理接口", description="使用DjangoNinja实现big_event后端管理接口") @app.get("/") def index(request): return "Hello Django Ninja" ``` 修改big_event/urls.py ```python from .api import app urlpatterns = [ path('admin/', admin.site.urls), path('api/', app.urls), ] 访问地址:http://127.0.0.1:8000/api/docs ``` ### 1.7 创建app ```shell python manage.py startapp system ``` ### 1.8 在Django中注册app big_event/settings.py中添加app ```python INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'system', ] ``` ### 1.9 app中创建路由 在system/router.py中添加路由 ```python from ninja import Router router = Router() @router.get('/') def index(request): return {'msg': 'Hello, World!'} ``` ### 1.10 注册路由 在big_event/api.py中注册路由 ```python from ninja import NinjaAPI from system.router import router as system_router app = NinjaAPI(title="BigEvent后端管理接口", description="使用DjangoNinja实现big_event后端管理接口") app.add_router('', system_router) ``` ### 1.11 使用env加载环境变量,修改数据库为mysql Django项目中使用.env文件来管理不同的环境变量(例如数据库连接信息、调试模式、日志级别等)是常见的做法 #### 1.11.1 安装python-dotenv ```shell pip install python-dotenv ``` #### 1.11.2 创建.env文件 创建.env文件 在项目根目录下创建.env文件,并在文件中添加需要定义的环境变量。 在开发环境下定义.env文件,将敏感信息写入.env文件 这里暂定数据库为big_event ```text SECRET_KEY=django-insecure-w)5(z@#f)l6%u)$22^um3xt=ejwqwwak(mbtaahu7au7lamqo(i DEBUG=True #数据库连接相关设置 DATABASE_NAME=big_event DATABASE_USER=root DATABASE_PASSWORD=123456 DATABASE_HOST=localhost DATABASE_PORT=3306 ``` #### 1.11.3 在Django中加载环境变量,修改数据库为mysql ```shell pip install mysqlclient ``` 在big_event/settings.py中加载环境变量 ```python import os from dotenv import load_dotenv # 使用默认的.env文件名。也可以指定不同的文件名。 load_dotenv() # 开启或关闭调试模式 DEBUG = os.getenv('DEBUG', False) SECRET_KEY = os.getenv('SECRET_KEY', 'default') # 修改数据库为mysql DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": os.getenv("DATABASE_NAME", "default"), "USER": os.getenv("DATABASE_USER", "default"), "PASSWORD": os.getenv("DATABASE_PASSWORD", ""), "HOST": os.getenv("DATABASE_HOST", ""), "PORT": os.getenv("DATABASE_PORT", ""), "OPTIONS": { "charset": "utf8mb4", }, } } ``` #### 1.11.4 加载不同的.env文件 在不同的环境中可以使用不同的.env文件来自定义环境变量。通常会把不同的.env文件保存在不同的目录下,并以不同的名称来区分不同的环境 ```text project/ ├── .env ├── .env.dev ├── .env.prod ├── myproject/ └── manage.py ``` 在开发环境中,可以通过如下方式来加载.env.dev文件 ```python import os from dotenv import load_dotenv # 指定.env.dev文件的路径 load_dotenv('.env.dev') ``` 同样的,在生产环境中可以通过如下方式来加载.env.prod文件 ```python import os from dotenv import load_dotenv # 指定.env.prod文件的路径 load_dotenv('.env.prod') ``` 通过不同环境中加载不同的.env文件,并自定义不同的环境变量,从而实现灵活高效的配置管理 ### 1.12 使用simpleUI修改后台管理 #### 1.12.1 安装simpleUI ```shell pip install simpleui ``` #### 1.12.2 在Django中使用simpleUI 在big_event/settings.py中添加simpleUI ```python # 修改project的setting文件,在INSTALLED_APPS 首行引入simple应用 INSTALLED_APPS = [ 'simpleui', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... ] ``` 在settings中还需设置静态资源 ```python # 定义静态资源位置 # 报错提示找不到静态目录,在settings.py指定静态目录 STATIC_ROOT = os.path.join(BASE_DIR, "static") # 在项目根目录下新建media目录 追加内容 # 图片资源访问路径,注意新建media这个目录 MEDIA_URL = 'media/' # 图片资源存放路径 MEDIA_ROOT =os.path.join(BASE_DIR, "media") # 由于开发过程中simpleui有限通过cdn进行页面渲染,一般情况下我们需要将其调整成本地资源方式,往往生产环境是无法连接外网的 # 离线模式 SIMPLEUI_STATIC_OFFLINE = True # 隐藏右侧simple广告链接、使用分析 SIMPLEUI_HOME_INFO = False SIMPLEUI_ANALYSIS = False ``` #### 1.12.4 更改管理后台名字 编辑system目录下的admin.py文件,添加如下代码 这个设置属于Django的设置,不属于SimpleUI的设置 ```python from django.contrib import admin # 设置header admin.site.site_header = 'BigEvent管理后台系统' # 设置title admin.site.site_title = 'BigEvent管理后台系统' ``` #### 1.12.5 收集simpleUI静态文件 ```shell # 生成表 python manage.py migrate # 收集simpleUI静态文件 python manage.py collectstatic ``` ### 1.13 运行项目 ```shell # 收集Django Admin文件 python manage.py collectstatic # 启动服务 python manage.py runserver ``` ## 二、后端管理系统搭建 ### 2.1 构建核心标准模型 #### 2.1.1 修改big_event/settions.py文件,添加用户模型 ```python AUTH_USER_MODEL = "system.Users" USERNAME_FIELD = "username" ``` #### 2.1.2 新建utils文件夹,创建models.py文件 ```python from django.db import models from big_event import settings class CoreModel(models.Model): """ 核心标准抽象模型模型,可直接继承使用 """ id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id") remark = models.CharField( max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述" ) creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True, verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL, db_constraint=False) modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人") update_datetime = models.DateTimeField( auto_now=True, null=True, blank=True, help_text="修改时间", verbose_name="修改时间" ) create_datetime = models.DateTimeField( auto_now_add=True, null=True, blank=True, help_text="创建时间", verbose_name="创建时间" ) sort = models.IntegerField( default=1, null=True, blank=True, verbose_name="显示排序", help_text="显示排序" ) class Meta: abstract = True verbose_name = "核心模型" verbose_name_plural = verbose_name ``` #### 2.1.3 system文件夹,修改models.py文件 ```python from django.db import models from django.contrib.auth.models import AbstractUser from utils.models import CoreModel class Users(AbstractUser, CoreModel): username = models.CharField( max_length=150, unique=True, db_index=True, verbose_name="用户账号", help_text="用户账号", ) email = models.EmailField( max_length=255, verbose_name="用户邮箱", null=True, blank=True, help_text="用户邮箱" ) user_pic = models.TextField(verbose_name="用户头像", null=True, blank=True, help_text="用户头像") nickname = models.CharField(max_length=40, null=True, blank=True,verbose_name="用户昵称", help_text="用户昵称") status = models.BooleanField(default=True, verbose_name="状态", help_text="状态") GENDER_CHOICES = ( (0, "女"), (1, "男"), ) gender = models.IntegerField( choices=GENDER_CHOICES, default=1, verbose_name="性别", null=True, blank=True, help_text="性别", ) class Meta: db_table = "system_users" verbose_name = "用户表" verbose_name_plural = verbose_name ordering = ("-create_datetime",) def __str__(self) -> str: return self.username ``` #### 2.1.4 system文件夹修改admin.py文件 使用django自带的admin模块进行注册 ```python from .models import Users @admin.register(Users) class UserAdmin(admin.ModelAdmin): list_display = ("username", "nickname", "email", "user_pic") search_fields = ("username", "nickname") list_filter = ("username",) ordering = ("-id",) ``` #### 2.1.5 生成模型类、管理后台 ```shell # 生成迁移文件 python manage.py makemigrations # 生成DB表 python manage.py migrate # 创建后台管理系统账号 admin, 执行命令进入交互窗口 python manage.py createsuperuser --username admin ```