一.环境搭建
1.1 安装xadmin及相关依赖
①.下载
pip install pillow # 图片处理
pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 # xadmin
pip install django-simple-captcha # 验证码
pip install django-pure-pagination # 分页
1.2 创建四个app及超级用户
①.app创建
python manage.py startapp users
python manage.py startapp course
python manage.py startapp organization
python manage.py startapp operation
②.超级用户
python manage.py createsuperuser
二.各models设计及settings设置
2.1 各app的models
①.course.models
from datetime import datetime from django.db import models class Course(models.Model): DEGREE_CHOICES = ( ("cj", "初级"), ("zj", "中级"), ("gj", "高级") ) name = models.CharField("课程名",max_length=50) desc = models.CharField("课程描述",max_length=300) detail = models.TextField("课程详情") degree = models.CharField(‘难度‘,choices=DEGREE_CHOICES, max_length=2) learn_times = models.IntegerField("学习时长(分钟数)",default=0) students = models.IntegerField("学习人数",default=0) fav_nums = models.IntegerField("收藏人数",default=0) image = models.ImageField("封面图",upload_to="courses/%Y/%m",max_length=100) click_nums = models.IntegerField("点击数",default=0) add_time = models.DateTimeField("添加时间",default=datetime.now,) class Meta: verbose_name = "课程" verbose_name_plural = verbose_name def __str__(self): return self.name class Lesson(models.Model): course = models.ForeignKey(Course,verbose_name=‘课程‘,on_delete=models.CASCADE) name = models.CharField("章节名",max_length=100) add_time = models.DateTimeField("添加时间",default=datetime.now) class Meta: verbose_name = "章节" verbose_name_plural = verbose_name def __str__(self): return ‘《{0}》课程的章节 >> {1}‘.format(self.course, self.name) class Video(models.Model): lesson = models.ForeignKey(Lesson, verbose_name="章节",on_delete=models.CASCADE) name = models.CharField("视频名",max_length=100) add_time = models.DateTimeField("添加时间", default=datetime.now) class Meta: verbose_name = "视频" verbose_name_plural = verbose_name class CourseResource(models.Model): course = models.ForeignKey(Course, verbose_name="课程",on_delete=models.CASCADE) name = models.CharField("名称",max_length=100) download = models.FileField("资源文件",upload_to="course/resource/%Y/%m",max_length=100) add_time = models.DateTimeField("添加时间", default=datetime.now) class Meta: verbose_name = "课程资源" verbose_name_plural = verbose_name
②.operation.models
from datetime import datetime from django.db import models from course.models import Course from users.models import UserProfile class UserAsk(models.Model): name = models.CharField(‘姓名‘,max_length=20) mobile = models.CharField(‘手机‘,max_length=11) course_name = models.CharField(‘课程名‘,max_length=50) add_time = models.DateTimeField(‘添加时间‘,default=datetime.now) class Meta: verbose_name = ‘用户咨询‘ verbose_name_plural = verbose_name def __str__(self): return self.name class CourseComments(models.Model): user = models.ForeignKey(UserProfile,verbose_name=‘用户‘,on_delete=models.CASCADE) course = models.ForeignKey(Course,verbose_name=‘课程‘,on_delete=models.CASCADE) comments = models.CharField(‘评论‘,max_length=200) add_time = models.DateTimeField(‘添加时间‘, default=datetime.now) class Meta: verbose_name = ‘课程评论‘ verbose_name_plural = verbose_name class UserFavorite(models.Model): FAV_TYPE = ( (1,‘课程‘), (2,‘课程机构‘), (3,‘讲师‘) ) user = models.ForeignKey(UserProfile,verbose_name=‘用户‘,on_delete=models.CASCADE) fav_id = models.IntegerField(‘数据id‘,default=0) fav_type = models.IntegerField(verbose_name=‘收藏类型‘,choices=FAV_TYPE,default=1) add_time = models.DateTimeField(‘添加时间‘, default=datetime.now) class Meta: verbose_name = ‘用户收藏‘ verbose_name_plural = verbose_name class UserMessage(models.Model): user = models.IntegerField(‘接受用户‘,default=0) message = models.CharField(‘消息内容‘,max_length=500) has_read = models.BooleanField(‘是否已读‘,default=False) add_time = models.DateTimeField(‘添加时间‘, default=datetime.now) class Meta: verbose_name = ‘用户消息‘ verbose_name_plural = verbose_name class UserCourse(models.Model): user = models.ForeignKey(UserProfile,verbose_name=‘用户‘,on_delete=models.CASCADE) course = models.ForeignKey(Course,verbose_name=‘课程‘,on_delete=models.CASCADE) add_time = models.DateTimeField(‘添加时间‘, default=datetime.now) class Meta: verbose_name = ‘用户课程‘ verbose_name_plural = verbose_name
③.organization.models
from datetime import datetime from django.db import models class CityDict(models.Model): name = models.CharField(‘城市‘,max_length=20) desc = models.CharField(‘描述‘,max_length=200) add_time = models.DateTimeField(default=datetime.now) class Meta: verbose_name = ‘城市‘ verbose_name_plural= verbose_name class CourseOrg(models.Model): name = models.CharField(‘机构名称‘,max_length=50) desc = models.TextField(‘机构描述‘) click_nums = models.IntegerField(‘点击数‘,default=0) fav_nums = models.IntegerField(‘收藏数‘,default=0) image = models.ImageField(‘封面图‘,upload_to=‘org/%Y%m‘,max_length=100) address = models.CharField(‘机构地址‘,max_length=150,) city = models.ForeignKey(CityDict,verbose_name=‘所在城市‘,on_delete=models.CASCADE) add_time = models.DateTimeField(default=datetime.now) class Meta: verbose_name = ‘课程机构‘ verbose_name_plural = verbose_name class Teacher(models.Model): org = models.ForeignKey(CourseOrg,verbose_name=‘所属机构‘,on_delete=models.CASCADE) name = models.CharField(‘教师名‘,max_length=50) work_years = models.IntegerField(‘工作年限‘,default=0) work_company = models.CharField(‘就职公司‘,max_length=50) work_position = models.CharField(‘公司职位‘,max_length=50) points = models.CharField(‘教学特点‘,max_length=50) click_nums = models.IntegerField(‘点击数‘,default=0) fav_nums = models.IntegerField(‘收藏数‘,default=0) add_time = models.DateTimeField(default=datetime.now) class Meta: verbose_name = ‘教师‘ verbose_name_plural = verbose_name def __str__(self): return "[{0}]的教师: {1}".format(self.org, self.name)
④.users.models
from datetime import datetime from django.db import models from django.contrib.auth.models import AbstractUser class UserProfile(AbstractUser): gender_choices = ( (‘male‘,‘男‘), (‘female‘,‘女‘) ) nick_name = models.CharField(‘昵称‘,max_length=50,default=‘‘) birthday = models.DateField(‘生日‘,null=True,blank=True) gender = models.CharField(‘性别‘,max_length=10,choices=gender_choices,default=‘female‘) adress = models.CharField(‘地址‘,max_length=100,default=‘‘) mobile = models.CharField(‘手机号‘,max_length=11,null=True,blank=True) image = models.ImageField(upload_to=‘image/%Y%m‘,default=‘image/default.png‘,max_length=100) class Meta: verbose_name = ‘用户信息‘ verbose_name_plural = verbose_name def __str__(self): return self.username class EmailVerifyRecord(models.Model): send_choices = ( (‘register‘,‘注册‘), (‘forget‘,‘找回密码‘) ) code = models.CharField(‘验证码‘,max_length=20) email = models.EmailField(‘邮箱‘,max_length=50) send_type = models.CharField(choices=send_choices,max_length=10) send_time = models.DateTimeField(default=datetime.now) class Meta: verbose_name = ‘邮箱验证码‘ verbose_name_plural = verbose_name class Banner(models.Model): title = models.CharField(‘标题‘,max_length=100) image = models.ImageField(‘轮播图‘,upload_to=‘banner/%Y%m‘,max_length=100) url = models.URLField(‘访问地址‘,max_length=200) index = models.IntegerField(‘顺序‘,default=100) add_time = models.DateTimeField(‘添加时间‘,default=datetime.now) class Meta: verbose_name = ‘轮播图‘ verbose_name_plural = verbose_name
2.2 settings设置
①.mysql设置
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘rconline‘, #数据库名字 ‘USER‘: ‘zry‘, #账号 ‘PASSWORD‘: ‘542858zry‘, #密码 ‘HOST‘: ‘127.0.0.1‘, #IP ‘PORT‘: ‘3306‘, #端口 } }
import pymysql pymysql.install_as_MySQLdb()
②.时区,时间设置
LANGUAGE_CODE = ‘zh-hans‘ TIME_ZONE = ‘Asia/Shanghai‘ USE_I18N = True USE_L10N = True USE_TZ = False
③.将xadmin,app等加入INSTALLED_APPS中
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘course‘, ‘operation‘, ‘organization‘, ‘users‘, ‘xadmin‘, ‘crispy_forms‘, ‘captcha‘, ]
④.添加extra_apps和apps路径
sys.path.insert(0,os.path.join(BASE_DIR, ‘apps‘)) sys.path.insert(0,os.path.join(BASE_DIR, ‘extra_apps‘))
⑤.设置media保存路径
# 上传图片 MEDIA_URL = ‘/media/‘ MEDIA_ROOT = os.path.join(BASE_DIR,‘media‘)
⑥.替换系统用户
#重载系统的用户,让UserProfile生效 AUTH_USER_MODEL = ‘users.UserProfile‘
⑦.迁移生成数据库
python manage.py makemigrations
python manage.py migrate
三.xadmin后台设置
3.1 编辑后台内容
①.course
import xadmin from .models import Course, Lesson, Video, CourseResource # Course的admin管理器 class CourseAdmin(object): ‘‘‘课程‘‘‘ list_display = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘] search_fields = [‘name‘, ‘desc‘, ‘detail‘, ‘degree‘, ‘students‘] list_filter = [ ‘name‘,‘desc‘,‘detail‘,‘degree‘,‘learn_times‘,‘students‘] class LessonAdmin(object): ‘‘‘章节‘‘‘ list_display = [‘course‘, ‘name‘, ‘add_time‘] search_fields = [‘course‘, ‘name‘] #这里course__name是根据课程名称过滤 list_filter = [‘course__name‘, ‘name‘, ‘add_time‘] class VideoAdmin(object): ‘‘‘视频‘‘‘ list_display = [‘lesson‘, ‘name‘, ‘add_time‘] search_fields = [‘lesson‘, ‘name‘] list_filter = [‘lesson‘, ‘name‘, ‘add_time‘] class CourseResourceAdmin(object): ‘‘‘课程资源‘‘‘ list_display = [‘course‘, ‘name‘, ‘download‘, ‘add_time‘] search_fields = [‘course‘, ‘name‘, ‘download‘] list_filter = [‘course__name‘, ‘name‘, ‘download‘, ‘add_time‘] # 将管理器与model进行注册关联 xadmin.site.register(Course, CourseAdmin) xadmin.site.register(Lesson, LessonAdmin) xadmin.site.register(Video, VideoAdmin) xadmin.site.register(CourseResource, CourseResourceAdmin)
from django.apps import AppConfig class CourseConfig(AppConfig): name = ‘course‘ verbose_name = ‘课程‘
default_app_config = ‘course.apps.CourseConfig‘
②.operation
import xadmin from .models import UserAsk, UserCourse, UserMessage, CourseComments, UserFavorite class UserAskAdmin(object): ‘‘‘用户表单我要学习‘‘‘ list_display = [‘name‘, ‘mobile‘, ‘course_name‘, ‘add_time‘] search_fields = [‘name‘, ‘mobile‘, ‘course_name‘] list_filter = [‘name‘, ‘mobile‘, ‘course_name‘, ‘add_time‘] # class UserCourseAdmin(object): ‘‘‘用户课程学习‘‘‘ list_display = [‘user‘, ‘course‘, ‘add_time‘] search_fields = [‘user‘, ‘course‘] list_filter = [‘user‘, ‘course‘, ‘add_time‘] class UserMessageAdmin(object): ‘‘‘用户消息后台‘‘‘ list_display = [‘user‘, ‘message‘, ‘has_read‘, ‘add_time‘] search_fields = [‘user‘, ‘message‘, ‘has_read‘] list_filter = [‘user‘, ‘message‘, ‘has_read‘, ‘add_time‘] class CourseCommentsAdmin(object): ‘‘‘用户评论后台‘‘‘ list_display = [‘user‘, ‘course‘, ‘comments‘, ‘add_time‘] search_fields = [‘user‘, ‘course‘, ‘comments‘] list_filter = [‘user‘, ‘course‘, ‘comments‘, ‘add_time‘] class UserFavoriteAdmin(object): ‘‘‘用户收藏后台‘‘‘ list_display = [‘user‘, ‘fav_id‘, ‘fav_type‘, ‘add_time‘] search_fields = [‘user‘, ‘fav_id‘, ‘fav_type‘] list_filter = [‘user‘, ‘fav_id‘, ‘fav_type‘, ‘add_time‘] # 将后台管理器与models进行关联注册。 xadmin.site.register(UserAsk, UserAskAdmin) xadmin.site.register(UserCourse, UserCourseAdmin) xadmin.site.register(UserMessage, UserMessageAdmin) xadmin.site.register(CourseComments, CourseCommentsAdmin) xadmin.site.register(UserFavorite, UserFavoriteAdmin)
from django.apps import AppConfig class OperationConfig(AppConfig): name = ‘operation‘ verbose_name = ‘用户操作‘
default_app_config = ‘operation.apps.OperationConfig‘
③.organization
import xadmin from .models import CityDict, CourseOrg, Teacher class CityDictAdmin(object): ‘‘‘城市‘‘‘ list_display = [‘name‘, ‘desc‘, ‘add_time‘] search_fields = [‘name‘, ‘desc‘] list_filter = [‘name‘, ‘desc‘, ‘add_time‘] class CourseOrgAdmin(object): ‘‘‘机构‘‘‘ list_display = [‘name‘, ‘desc‘, ‘click_nums‘, ‘fav_nums‘,‘add_time‘ ] search_fields = [‘name‘, ‘desc‘, ‘click_nums‘, ‘fav_nums‘] list_filter = [‘name‘, ‘desc‘, ‘click_nums‘, ‘fav_nums‘,‘city__name‘,‘address‘,‘add_time‘] class TeacherAdmin(object): ‘‘‘老师‘‘‘ list_display = [ ‘name‘,‘org‘, ‘work_years‘, ‘work_company‘,‘add_time‘] search_fields = [‘org‘, ‘name‘, ‘work_years‘, ‘work_company‘] list_filter = [‘org__name‘, ‘name‘, ‘work_years‘, ‘work_company‘,‘click_nums‘, ‘fav_nums‘, ‘add_time‘] xadmin.site.register(CityDict, CityDictAdmin) xadmin.site.register(CourseOrg, CourseOrgAdmin) xadmin.site.register(Teacher, TeacherAdmin)
from django.apps import AppConfig class OrganizationConfig(AppConfig): name = ‘organization‘ verbose_name = ‘机构‘
default_app_config = ‘organization.apps.OrganizationConfig‘
④.users
import xadmin from .models import EmailVerifyRecord,Banner from xadmin import views # 创建xadmin的最基本管理器配置,并与view绑定 class BaseSetting(object): # 开启主题功能 enable_themes = True use_bootswatch = True # 全局修改,固定写法 class GlobalSettings(object): # 修改title site_title = ‘NBA后台管理界面‘ # 修改footer site_footer = ‘科比的公司‘ # 收起菜单 menu_style = ‘accordion‘ #xadmin中这里是继承object,不再是继承admin class EmailVerifyRecordAdmin(object): # 显示的列 list_display = [‘code‘, ‘email‘, ‘send_type‘, ‘send_time‘] # 搜索的字段 search_fields = [‘code‘, ‘email‘, ‘send_type‘] # 过滤 list_filter = [‘code‘, ‘email‘, ‘send_type‘, ‘send_time‘] class BannerAdmin(object): list_display = [‘title‘, ‘image‘, ‘url‘,‘index‘, ‘add_time‘] search_fields = [‘title‘, ‘image‘, ‘url‘,‘index‘] list_filter = [‘title‘, ‘image‘, ‘url‘,‘index‘, ‘add_time‘] xadmin.site.register(EmailVerifyRecord,EmailVerifyRecordAdmin) xadmin.site.register(Banner,BannerAdmin) # 将基本配置管理与view绑定 xadmin.site.register(views.BaseAdminView,BaseSetting) # 将title和footer信息进行注册 xadmin.site.register(views.CommAdminView,GlobalSettings)
from django.apps import AppConfig class UsersConfig(AppConfig): name = ‘users‘ verbose_name = ‘用户‘
default_app_config = ‘users.apps.UsersConfig‘
⑤.urls.py配置
import xadmin from django.urls import path from django.views.generic import TemplateView urlpatterns = [ path(‘xadmin/‘, xadmin.site.urls), path(‘‘, TemplateView.as_view(template_name=‘index.html‘),name=‘index‘), ]
此时的项目结构 # 其他一些前端,图片等文件可去GitHub下载
原文:https://www.cnblogs.com/JangNara/p/12996318.html