Django后台管理系统:
特点:
权限管理,少前端样式,快速开发
Django默认提供我们一个admin管理系统,但这里我们使用功能更为强大的Django插件xadmin
- 安装:
- pip安装:pip install xadmin (这样会帮我们顺便安装好依赖crispy_forms) 2.源码安装(这里使用源码安装)和前期配置(settings.urls,还有注册xadmin自带的表,创建超级用户):
- 下载源码后解压,把xadmin文件夹拖到工作目录extra_apps(专门放外部的app,xadmin相当于一个app),但这样要另外安装依赖crispy_forms。(推荐先pip再源码安装);
- 把extra_apps设为source root,同时在setting设为根目录
4.在setting中修改语言为中文,时区为上海,使用本地时间(不然数据库存储时会使用国际时间)
5.在setting中注册\'xadmin\',和依赖\'crispy_forms\'(xadmin相当于一个app):
6.在urls中把默认的admin改成xadmin
7.在控制台创建一个超级用户:createsuperuser
如果出现:Superuser creation skipped due to not running in a TTY. You can run manage.py createsuperuser in your project to create one manually.这个错误的
解决方法就是在cmd中进入manage.py目录使用命令行 Python2 manage.py createsuperuser 这样就可以成功了
8..makemigrations,migrate应用下xadmin 的表
1 # -*- coding utf-8 -*- 2 # coding=utf-8 3 4 """ 5 Django settings for DjangoStart2 project. 6 7 Generated by \'django-admin startproject\' using Django 1.9.8. 8 9 For more information on this file, see 10 https://docs.djangoproject.com/en/1.9/topics/settings/ 11 12 For the full list of settings and their values, see 13 https://docs.djangoproject.com/en/1.9/ref/settings/ 14 """ 15 16 import os 17 import sys 18 19 # 当前根目录 20 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 21 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 22 sys.path.insert(0,os.path.join(BASE_DIR,\'apps\')) # 把apps添加到根目录 23 sys.path.insert(0,os.path.join(BASE_DIR,\'extra_apps\')) # 把apps添加到根目录 24 25 26 # Quick-start development settings - unsuitable for production 27 # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ 28 29 # SECURITY WARNING: keep the secret key used in production secret! 30 SECRET_KEY = \'xo8n5^ll91j1(iqbj+-w@41^#%cp!y_3i*k_1!s*8u*t9l@=fc\' 31 32 # SECURITY WARNING: don\'t run with debug turned on in production! 33 DEBUG = True 34 35 ALLOWED_HOSTS = [] 36 37 38 # Application definition 39 40 INSTALLED_APPS = [ 41 \'django.contrib.admin\', 42 \'django.contrib.auth\', 43 \'django.contrib.contenttypes\', 44 \'django.contrib.sessions\', 45 \'django.contrib.messages\', 46 \'django.contrib.staticfiles\', 47 \'users\', 48 \'courses\', 49 \'organization\', 50 \'operation\', 51 \'xadmin\', 52 \'crispy_forms\' 53 ] 54 AUTH_USER_MODEL = "users.UserProfile" 55 56 MIDDLEWARE_CLASSES = [ 57 \'django.middleware.security.SecurityMiddleware\', 58 \'django.contrib.sessions.middleware.SessionMiddleware\', 59 \'django.middleware.common.CommonMiddleware\', 60 \'django.middleware.csrf.CsrfViewMiddleware\', 61 \'django.contrib.auth.middleware.AuthenticationMiddleware\', 62 \'django.contrib.auth.middleware.SessionAuthenticationMiddleware\', 63 \'django.contrib.messages.middleware.MessageMiddleware\', 64 \'django.middleware.clickjacking.XFrameOptionsMiddleware\', 65 ] 66 67 ROOT_URLCONF = \'DjangoStart2.urls\' 68 69 TEMPLATES = [ 70 { 71 \'BACKEND\': \'django.template.backends.django.DjangoTemplates\', 72 \'DIRS\': [os.path.join(BASE_DIR, \'templates\')] 73 , 74 \'APP_DIRS\': True, 75 \'OPTIONS\': { 76 \'context_processors\': [ 77 \'django.template.context_processors.debug\', 78 \'django.template.context_processors.request\', 79 \'django.contrib.auth.context_processors.auth\', 80 \'django.contrib.messages.context_processors.messages\', 81 ], 82 }, 83 }, 84 ] 85 86 WSGI_APPLICATION = \'DjangoStart2.wsgi.application\' 87 88 89 # Database 90 # https://docs.djangoproject.com/en/1.9/ref/settings/#databases 91 92 DATABASES = { 93 \'default\': { 94 \'ENGINE\': \'django.db.backends.mysql\', 95 \'NAME\':"educationDjango", 96 \'USER\':"root", 97 \'PASSWORD\':"yy123456", 98 \'HOST\':"127.0.0.1", 99 100 } 101 } 102 103 104 # Password validation 105 # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators 106 107 AUTH_PASSWORD_VALIDATORS = [ 108 { 109 \'NAME\': \'django.contrib.auth.password_validation.UserAttributeSimilarityValidator\', 110 }, 111 { 112 \'NAME\': \'django.contrib.auth.password_validation.MinimumLengthValidator\', 113 }, 114 { 115 \'NAME\': \'django.contrib.auth.password_validation.CommonPasswordValidator\', 116 }, 117 { 118 \'NAME\': \'django.contrib.auth.password_validation.NumericPasswordValidator\', 119 }, 120 ] 121 122 123 # Internationalization 124 # https://docs.djangoproject.com/en/1.9/topics/i18n/ 125 126 LANGUAGE_CODE = \'zh_hans\' 127 128 TIME_ZONE = \'Asia/Shanghai\' 129 130 USE_I18N = True 131 132 USE_L10N = True 133 134 USE_TZ = False 135 136 137 # Static files (CSS, JavaScript, Images) 138 # https://docs.djangoproject.com/en/1.9/howto/static-files/ 139 140 STATIC_URL = \'/static/\' 141 STATIC_ROOT = os.path.join(BASE_DIR, \'static\') 142 # STATICFILES_DIRS ,指定额外的静态文件存储位置。注意设置的值是一个元组数据类型 143 # STATICFILES_DIRS = [ 144 # os.path.join(BASE_DIR,\'static\') 145 # ]
1 """DjangoStart2 URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/1.9/topics/http/urls/ 5 Examples: 6 Function views 7 1. Add an import: from my_app import views 8 2. Add a URL to urlpatterns: url(r\'^$\', views.home, name=\'home\') 9 Class-based views 10 1. Add an import: from other_app.views import Home 11 2. Add a URL to urlpatterns: url(r\'^$\', Home.as_view(), name=\'home\') 12 Including another URLconf 13 1. Import the include() function: from django.conf.urls import url, include 14 2. Add a URL to urlpatterns: url(r\'^blog/\', include(\'blog.urls\')) 15 """ 16 from django.conf.urls import url 17 from django.contrib import admin 18 import xadmin 19 urlpatterns = [ 20 url(r\'^xadmin/\', xadmin.site.urls), 21 ]
- 把我们写的数据表注册到xadmin中(user表默认注册进去了)
1.在每个app下新建adminx.py(xadmin会默认搜索每个app下的adminx.py文件)
2.在adminx中新建个管理类(继承object),命名方式为:需要注册的表名加Admin
3.xadmin.site.register(表名,对应的管理类)
扩展:
4.可以在对应的models上重载__unicode__方法,自定义显示形式
# 重载__unicode__方法,使在页面显示时用111(2@qq.com)的形式显示
def __unicode__(self):
return \'{0}({1})\'.format(self.code,self.email)
5.自定义显示列,过滤器,搜索框(时间不要添加进去,时间搜索不好做,但可以把时间放进过滤器里)
在对应的adminx中的对应管理类中。
1 # -*- coding utf-8 -*- 2 # coding=utf-8 3 import xadmin 4 from .models import EmailVerityRecord 5 6 class EmailVerityRecordAdmin(object): 7 # 自定义显示列 8 list_display = [\'code\',\'email\',\'send_type\',\'send_time\'] 9 # 搜索框(时间不要添加进去,时间搜索不好做,当可以把时间放进过滤器里) 10 search_fields = [\'code\',\'email\',\'send_type\'] 11 # 过滤器 12 list_filter = [\'code\',\'email\',\'send_type\',\'send_time\'] 13 xadmin.site.register(EmailVerityRecord,EmailVerityRecordAdmin)