项目树

引入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. InChatter系统之客户端实现原理与阶段小结

    InChatter客户端的开发可以说是目前系统的阶段性结尾了.很抱歉的是,这篇文章来的这么晚,迟到了这么久. 在客户端的开发主要针对两个方面: 消息的传输与处理 消息的UI交互处理 一.消息的传输与处 ...

  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ...

  3. Swift3命名空间的实现

    最近在看一些Swift开源库的时候,发现了一些优秀的开源库都使用了命名空间,例如Kingfisher这个开源库中,就针对UIImage,UIImageView,UIButton做了命名空间的扩展.通过 ...

  4. opencv实现人脸,人眼,微笑检测

    1.首先实现人脸检测 import cv2 img = cv2.imread("people.jpg",1) #读入图像 #导入人脸级联分类器引擎,“.xml”文件里包含了训练出来 ...

  5. 谈谈如何来查看GC日志

    一.首先来看一下JVM中的GC有哪几种类型? 1.-XX:UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后,使用Serial+Serial Old收集器组合进行垃圾收集. ...

  6. (独孤九剑)--PHP简介与现况

    (1)为什么学习PHP? 1.好就业: 2.入门简单,学习周期短,两个月即可: 3.学习编程思路,使编程习惯更加规范: 4.大公司直招: 5.处理大并发数据: 6.开源,所以更加安全 (2)PHP是什 ...

  7. formatDate() 格式化日期

    function datefmt(milSec, format) { var oldTime = Number(milSec); //得到毫秒数 // 日期格式转换 var t = new Date( ...

  8. bootstrap不兼容ie8如何解决

    说起bootstrap大家一定都不陌生,可以说是目前最受欢迎的前端框架,简洁.直观.强悍.移动设备优先的前端开发框架,让web开发更迅速.简单. 但是在实际运用中也会遇到各种各样的问题,比如最近项目中 ...

  9. 禁止浏览器static files缓存篇

    由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. Meta法 目前在chrome调试还没有遇到问题,好用!此方法假设浏览器是个好人!很听我们的话! <meta http ...

  10. Python入门之类(class)

    面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 一.封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到 ...