Django学习系列之Python+Xadmin
项目树
引入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的更多相关文章
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- Django学习系列6:使用selenium测试用户交互
学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...
- django学习系列——python和php对比
python 和 php 我都是使用过,这里不想做一个非常理性的分析,只是根据自己的经验谈一下感想. 在web开发方面,无疑 php 更甚一筹. 从某种角度来说,php 就是专门为 web 定制的语言 ...
- Python&Django学习系列之-激活管理界面
1.创建你个人的项目与APP 2.填写你的数据库名称与数据库类型,这里使用内置的sqllite3 3.修改setting文件 a.将'django.contrib.admin'加入setting的IN ...
- Django学习系列12:把Python变量传入模板中渲染
从视图的Python代码中把变量传入HTML模板. 模板中使用哪种句法引入Python对象,要使用的符号{{...}},它会以字符串的形式显示对象: <html> <head> ...
- Python零基础学习系列之三--Python编辑器选择
上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...
- Django学习系列5:为视图编写单元测试
打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...
- Python零基础学习系列之四--Python程序设计思想
前面我们把Python环境安装成功,同时也选择了自己合适的IDE工具来开启自己的编程之旅. 那么今天来说说怎么编程,程序设计需要什么步骤,我们应该怎么做才能编写自己的程序. 1-1.程序设计方法: I ...
- Django学习系列之request对象
先来一个简单的实例 urls.py from django.conf.urls import url from django.contrib import admin from cmdb import ...
随机推荐
- Codeforces_B.Maximum Sum of Digits
http://codeforces.com/contest/1060/problem/B 题意:将n拆为a和b,让a+b=n且S(a)+S(b)最大,求最大的S(a)+S(b). 思路:考虑任意一个数 ...
- swift派发机制的核心是确定一个函数能否进入动态派发列表
swift派发机制的核心是确定一个函数能否进入动态派发列表
- close - 关闭一个文件描述符
SYNOPSIS 总览 #include <unistd.h> int close(int fd); DESCRIPTION 描述 close 关闭 一个 文件 描述符 , 使它 不在 指 ...
- C 语言指针 5 分钟教程
指针.引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.在这份教程里“引用”表示计算机内存地址.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具 ...
- 为什么java String是固定的 为什么字符串是不可变的
String类不可变的好处 String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得S ...
- 入门迅速、应用广泛、月薪两万,马哥Python前景为什么这么好?
随着Python的技术的流行,Python在为人们带来工作与生活上带来了很多的便捷,因为Python简单,学起来快,也是不少新手程序员入门的首选语言.新手们比较关心的就是Python的发展前景与方向. ...
- 德尔福 XE5 安卓权限设置
http://delphi.org/2013/10/delphi-xe5-android-uses-permissions/ The permissions required by a Delphi ...
- ubuntu(linux)占领小米平板2(mipad2)
昨天 2014年,媳妇坐月子,给媳妇买了mi6和一个小米平板2(16G).是我们人生拥有的第一个平板,激动不已. 买之前看了小米平板1的口碑不错,arm构架,NVIDIA的主板好像,图形处理做得当然没 ...
- Runlevel in Linux
运行级别(Runlevel)指的是Unix或者Linux等类Unix操作系统下不同的运行模式.运行级别通常分为7等,分别是从0到6,但如果必要的话也可以更多. 例如在大多数Linux操作系统下一共有如 ...
- thinkphp5 框架修改的地方
框架修改的地方 vendor/topthink/think-captcha/src/Captcha.php api验证码入库 196行 $img_code = strtoupper(implode(' ...