项目树

引入xadmin

pycharm在项目中创建存放xadmin的目录

右键项目名称-->pythonpackage-->输入名称:extra_app

拷贝xadmin代码到extra_app

(mxonline) zhaijunming@zhaijuningdeMBP:~/Desktop/Project/python$ git clone  https://github.com/zaxlct/imooc-django.git
(mxonline) zhaijunming@zhaijuningdeMBP:~/Desktop/Project/python$ cp -r imooc-django/extra_apps/xadmin MxOnline/extra_apps/.

配置settings.py

# 设置 apps, extra_apps 目录
sys.path.insert(,os.path.join(BASE_DIR,'apps'))
sys.path.insert(, os.path.join(BASE_DIR, 'extra_apps')) #添加xadmin app
INSTALLED_APPS = [
'xadmin',
'crispy_forms',
] LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False

配置url

MxOnline/urls.py

from django.conf.urls import url
from django.contrib import admin
import xadmin urlpatterns = [
url(r'^admin/', xadmin.site.urls),
]

生成数据表

makemigrations
migrate

测试

访问127.0.0.1:8000/admin

页头和页尾自定义

随便一个项目的adminx.py中增加以下代码

from xadmin import views

class GlobalSetting(object):
site_title = "慕学网后台管理系统"
site_footer = "慕学在线网" xadmin.site.register(views.CommAdminView, GlobalSetting)

左侧菜单栏样式改变

修改前

修改后

随便一个项目的adminx.py中增加以下代码

from xadmin import views

class GlobalSetting(object):
site_title = "慕学网后台管理系统"
site_footer = "慕学在线网"
menu_style = "accordion" xadmin.site.register(views.CommAdminView, GlobalSetting)

左侧菜单栏app名称改成中文

修改前

修改后

每一个app同理

比如users这个app

users-->apps.py

from django.apps import AppConfig

class UsersConfig(AppConfig):
name = 'users'
verbose_name = '用户信息' 增加这个字段,这个就是要显示的名称

users-->init.py

default_app_config = "users.apps.UsersConfig"

将models注册进xadmin

表结构(models.py)

from django.db import models
from datetime import datetime
from organization.models import *
# Create your models here.
#这里有多个表,CourseOrg(机构表),course(课程表),lesson(章节表),Video(视频表),机构和课程是一对多的关系,一个机构有多个课程,课程和章节是一对多的关系,一个课程有多个章节,章节和视频也是一对多关系,一个章节有多个视频
class CourseOrg(models.Model):
'''机构'''
name = models.CharField(max_length=50,verbose_name='机构名称')
choice_category = (
('pxjg', '培训机构'),
('gx', '高校'),
('gr', '个人'),
)
category = models.CharField(default='pxjg',max_length=20,choices=choice_category)
desc = models.TextField(verbose_name='机构描述')
click_num = models.IntegerField(default=0,verbose_name='点击数')
fav_num = models.IntegerField(default=0,verbose_name='收藏数')
image = models.ImageField(upload_to='org/%Y/%m',verbose_name='logo')
address = models.CharField(max_length=150,verbose_name='机构地址')
city = models.ForeignKey(CityDict,verbose_name='机构所在城市')
student = models.IntegerField(default=0,verbose_name='学习人数')
course_nums = models.IntegerField(default=0,verbose_name='课程数')
add_time = models.DateTimeField(default=datetime.now) class Meta:
verbose_name = '课程机构'
verbose_name_plural = '课程机构' def __str__(self):
return self.name
class Course(models.Model):
'''课程'''
course_org = models.ForeignKey(CourseOrg,verbose_name='课程机构',null=True,blank=True)
name = models.CharField(max_length=,verbose_name='课程名')
desc = models.CharField(max_length=,verbose_name='课程描述')
detail = models.TextField(verbose_name='课程详情')
choice_degree = (
('cj','初级'),
('zj','中级'),
('gj','高级'),
)
degree = models.CharField(choices=choice_degree,max_length=,verbose_name='课程难度')
learn_times = models.IntegerField(default=,verbose_name='学习时长(分钟数)')
students = models.IntegerField(default=,verbose_name='学习人数')
fav_nums = models.IntegerField(default=,verbose_name='收藏人数')
image = models.ImageField(upload_to='courses/%Y/%m',verbose_name='封面图')
click_nums = models.IntegerField(default=,verbose_name='点击数')
add_time = models.DateTimeField(default=datetime.now,verbose_name='添加时间') class Meta:
verbose_name = '课程'
verbose_name_plural = '课程' def __str__(self):
return self.name class Lesson(models.Model):
'''章节'''
course = models.ForeignKey(Course,verbose_name='课程')
name = models.CharField(max_length=,verbose_name='章节名称')
add_time = models.DateTimeField(default=datetime.now,verbose_name='添加时间') class Meta:
verbose_name = '章节'
verbose_name_plural = '章节' def __str__(self):
return self.name class Video(models.Model):
'''视频'''
lesson = models.ForeignKey(Lesson,verbose_name='章节')
name = models.CharField(max_length=,verbose_name='视频名称')
add_time = models.DateTimeField(default=datetime.now,verbose_name='添加时间') class Meta:
verbose_name = '视频'
verbose_name_plural = '视频' def __str__(self):
return self.name

adminx.py

import xadmin
from xadmin import views from .models import * class CourseAdmin(object):
list_display = ['course_org','name', 'desc', 'detail', 'degree','learn_times','students','fav_nums','image','click_nums','add_time']
search_fields = ['course_org','name', 'desc', 'detail', 'degree','students','fav_nums','image','click_nums']
list_filter = ['course_org__name','name', 'desc', 'detail', 'degree','learn_times','students','fav_nums','image','click_nums','add_time'] class LessonAdmin(object):
list_display = ['course', 'name','add_time']
search_fields = ['course', 'name']
#由于lesson和course是一对多关系,一个课程有多个章节,这里的course是course 的外键,想要根据课程名称过滤章节的话,需要指定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', 'name', 'add_time'] xadmin.site.register(Course,CourseAdmin)
xadmin.site.register(Lesson,LessonAdmin)
xadmin.site.register(Video,VideoAdmin)
#我们把course,lesson,video注册进xadmin了

效果:

Django学习系列之Python+Xadmin的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  3. django学习系列——python和php对比

    python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...

  4. Python&Django学习系列之-激活管理界面

    1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...

  5. Django学习系列12:把Python变量传入模板中渲染

    从视图的Python代码中把变量传入HTML模板. 模板中使用哪种句法引入Python对象,要使用的符号{{...}},它会以字符串的形式显示对象: <html> <head> ...

  6. Python零基础学习系列之三--Python编辑器选择

    上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...

  7. Django学习系列5:为视图编写单元测试

    打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...

  8. Python零基础学习系列之四--Python程序设计思想

    前面我们把Python环境安装成功,同时也选择了自己合适的IDE工具来开启自己的编程之旅. 那么今天来说说怎么编程,程序设计需要什么步骤,我们应该怎么做才能编写自己的程序. 1-1.程序设计方法: I ...

  9. Django学习系列之request对象

    先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...

随机推荐

  1. node.js入门之三

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux ...

  2. 网页制作常用的CSS知识

    在制作网页中,我们会用到很多CSS的知识,在这里我简单的总结了一些. div    划分区块 ul,li 无序列表(配合划分区块) ol,li 有序列表 a 超链接标签 p 段落标签 h 标题标签 i ...

  3. zTree 点击文字 勾选check

    callback: { onClick:function(event, treeId, treeNode){ console.info("onClick") var treeObj ...

  4. vitualbox网络设置链接

    网文摘录地址:https://blog.csdn.net/yushupan/article/details/78404395 vitualbox网络设置: 一.NAT模式 特点: 1.如果主机可以上网 ...

  5. 2019年,Linux运维行业的趋势,跟不上学习就被淘汰

    运维行业经历了多年的发展,已经有了很大的变化,最开始的机房.网线.人肉,到现在一步步的自动化.智能化.容器化,运维人员的职业技能要求越来越高,稍不注意就可能被淘汰. 今天马小哥就来盘点一下2019年运 ...

  6. PS学习一

    1.使用缩放工具时是对文档窗口进行的缩放,它只影响视图比例:而对图像的缩放则是指对图像文件本身进行的物理缩放,它会使图像的内容变大或变小. 2.分辨率是指单位长度内包含的像素点的数量,它的单位通常为像 ...

  7. ECNU 3263 丽娃河的狼人传说 (贪心)

    链接:http://acm.ecnu.edu.cn/problem/3263/ 题意: 从 1 到 n 的一条数轴.有 m 个区间至少要安装一定数量的路灯,路灯只能装在整数点上,有k盏路灯已经安装好  ...

  8. es6(var,let,const,set,map,Array.from())

    1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function ...

  9. c语音 dll断点调试方法

    转自:https://blog.csdn.net/qingzai_/article/details/45348613 dll调试方法: 1.把最新生成的dll和pdb放到 启动这个dll 的进程目录下 ...

  10. idea 修改Git密码和账号方法

    IDEA修改git账号及密码的方法: 1.file->settings->passwords 2.重启IDEA 3.执行一次提交或更新 当执行提交或更新之后,idea会自动提示输入账号.密 ...