需求应用图css
======================================================html
经常使用组件python
django mysql
bootstrapreact
jqueryjquery
python 3sql
PyCharm数据库
MySQLdjango
mysql-python(http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python)或者pymysqbootstrap
命令
SHOW DATABASES;
建立名称为PerfectCRM的数据库
CREATE DATABASE PerfectCRM;
删除名称为PerfectCRM的数据库
DROP DATABASE PerfectCRM;
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
数据库配置问题:难点
安装
pip install PyMySQ
配置pymysql,再主目录点 __init__
import pymysql pymysql.install_as_MySQLdb()
===========================================
数据库设置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'PerfectCRM', 'USER': 'root', 'PASSWORD': 'root', 'HOST': '127.0.0.1', 'PORT': '3306', } }
建立项目,设置表结构
├─.idea ├─crm │ └─migrations ├─PerfectCRM │ └─__pycache__ └─templates
设置stting app
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'crm', ]
templates搜索路径
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'PerfectCRM.wsgi.application'
静态文件设置
STATIC_URL = '/static/' STATICFILES_DIRS=( os.path.join(BASE_DIR,'statics'), )
models.py 表设置
备用model
1 from django.db import models 2 from django.contrib.auth.models import User 3 4 # Create your models here. 5 6 7 class Customer(models.Model): 8 '''客户信息表''' 9 name = models.CharField(max_length=32,blank=True,null=True,verbose_name='客户姓名') #32个字节 ,能够写10个汉字,blank=True admin能够不太填写,null=True数据库能够不填写 10 qq = models.CharField(max_length=64,unique=True,verbose_name= 'QQ') #unique 惟一值 11 qq_name = models.CharField(max_length=64, blank=True, null=True,verbose_name='QQ呢陈') 12 phone = models.CharField(max_length=64, blank=True, null=True,verbose_name='手机号') 13 source_choises = ((0,'转介绍'), 14 (1,'QQ群'), 15 (2,'官网'), 16 (3,'百度推广'), 17 (4,'51CTO'), 18 (5, '知乎'), 19 (6, '市场推广')) #来源 20 source = models.SmallIntegerField(choices=source_choises,verbose_name='途径') 21 referral_from = models.CharField(verbose_name='转介绍人',max_length=64, blank=True, null=True) 22 consult_course = models.ForeignKey('Course',verbose_name='咨询课程') 23 content = models.TextField(verbose_name='咨询详情') 24 tags = models.ManyToManyField('Tag',blank=True,verbose_name='标签') 25 status_choices = ((0, '已报名'), 26 (1, '未报名'), 27 ) 28 29 status = models.SmallIntegerField(choices=status_choices, default=1) 30 consultant = models.ForeignKey('UserProfile',verbose_name='咨询人') #咨询人 31 memo = models.TextField(blank=True, null=True,verbose_name='备注') 32 date = models.DateTimeField(auto_now_add=True,verbose_name='咨询时间') #时间自增 33 34 def __str__(self): 35 return self.qq 36 37 class Meta: 38 verbose_name = "客户表" 39 verbose_name_plural = "客户表" 40 class Tag(models.Model): 41 name = models.CharField(unique=True,max_length=32) #标签名惟一 42 def __str__(self): 43 return self.name 44 45 class Meta: 46 verbose_name = "标签" 47 verbose_name_plural = "标签" 48 class CustomerFollowUp(models.Model): 49 '''客户跟进表''' 50 customer = models.ForeignKey('Customer') 51 content = models.TextField(verbose_name='跟进内容') 52 consultant = models.ForeignKey('UserProfile') 53 54 intention_choices = ((0,'2周内报名'), 55 (1, '1个月内报名'), 56 (2, '近期无报名计划'), 57 (2, '近期无报名计划'), 58 (3, '一再其它机构报名'), 59 (4, '已报名'), 60 (5, '已拉黑')) 61 intention = models.SmallIntegerField(choices=intention_choices) 62 date = models.DateTimeField(auto_now_add=True) # 自动统计时间 63 def __str__(self): 64 return "<%s : %s>" %(self.customer.name,self.intention) 65 66 class Meta: 67 verbose_name = "客户跟进记录" 68 verbose_name_plural = "客户跟进记录" 69 class Course(models.Model): 70 '''课程表''' 71 name = models.CharField(max_length=64,unique=True) #课程名 72 price = models.PositiveSmallIntegerField() #价格正书 73 period = models.PositiveSmallIntegerField(verbose_name='周期') # 周期 74 outline = models.TextField() #课程大纲 75 76 class Meta: 77 verbose_name = "课程表" 78 verbose_name_plural = "课程表" 79 80 class Branch(models.Model): 81 '''校区''' 82 name = models.CharField(max_length=128,unique=True) 83 addr= models.CharField(max_length=128) #地址 84 85 class Meta: 86 verbose_name = "校区" 87 verbose_name_plural = "校区" 88 89 class ClassList(models.Model): 90 '''班级表''' 91 branch = models.ForeignKey("Branch", verbose_name="校区") 92 course = models.ForeignKey("Course") #对应课程 93 class_type_choices = ((0, '面授(脱产)'), 94 (1, '面授(周末)'), 95 (2, '网络班') 96 ) 97 class_type = models.SmallIntegerField(choices=class_type_choices, verbose_name="班级类型") 98 semester = models.PositiveSmallIntegerField(verbose_name="学期") 99 teachers = models.ManyToManyField("UserProfile") 100 start_date = models.DateField(verbose_name="开班日期") 101 end_date = models.DateField(verbose_name="结业日期", blank=True, null=True) 102 103 def __str__(self): 104 return "%s %s %s" %(self.branch,self.course,self.semester) # 校区 课程 学期 105 106 class Meta: 107 unique_together = ('branch', 'course', 'semester') 108 verbose_name_plural = "班级表" 109 verbose_name = '班级表' 110 111 class CourseRecord(models.Model): 112 '''上课记录''' 113 from_class = models.ForeignKey('ClassList',verbose_name='班级') 114 day_num = models.PositiveSmallIntegerField(verbose_name='第几节(天)') 115 teacher = models.ForeignKey('UserProfile',verbose_name='教师') 116 has_homework = models.BooleanField(default=True) 117 homework_title = models.CharField(max_length=128,blank=True,null=True) #有无做业 118 homework_content = models.CharField(max_length=128, blank=True, null=True) #做业内容 119 outline = models.TextField(verbose_name='本节课大纲') 120 date = models.DateField(auto_now_add=True) 121 122 def __str__(self): 123 return "%s %s "%(self.from_class,self.day_num) 124 125 class Meta: 126 unique_together = ('from_class','day_num') #班级和第几天是惟一的值 127 verbose_name_plural = "上课记录" 128 ''' 129 ordering=['order_date'] # 按订单升序排列 130 ordering=['-order_date'] # 按订单降序排列,-表示降序 131 ordering=['?order_date'] # 随机排序,?表示随机 132 permissions 133 134 permissions主要是为了在Django Admin管理模块下使用的,若是你设置了这个属性可让指定的方法权限描述更清晰可读。 135 proxy 136 137 这是为了实现代理模型使用的,这里先不讲随后的文章介绍。 138 unique_together 139 140 unique_together这个选项用于:当你须要经过两个字段保持惟一性时使用。好比假设你但愿,一个Person的FirstName和LastName二者的组合必须是惟一的,那么须要这样设置: 141 unique_together = (("first_name", "last_name"),) 142 verbose_name 143 144 verbose_name的意思很简单,就是给你的模型类起一个更可读的名字: 145 verbose_name = "pizza" 146 verbose_name_plural 147 这个选项是指定,模型的复数形式是什么,好比: 148 verbose_name_plural = "stories" 149 若是不指定Django会自动在模型名称后加一个’s’ 150 ''' 151 152 153 class StudyRecord(models.Model): 154 '''学习纪律 155 ''' 156 student = models.ForeignKey('Enrollment') #对应报名表 157 course_record = models.ForeignKey('CourseRecord') #对应上课纪律 158 attendance_choices = ((0,'已签到'), 159 (1, '迟到'), 160 (2, '缺勤'), 161 (3, '早退'), 162 ) 163 attendance = models.SmallIntegerField(choices=attendance_choices,default=0) 164 score_choices = ((100,'A+'), 165 (90, 'A'), 166 (85, 'B+'), 167 (80, 'B'), 168 (75, 'B-'), 169 (70, 'C+'), 170 (60, 'C'), 171 (40, 'C-'), 172 (-50, 'D'), 173 (-100, 'copy'), 174 (0, 'N/A'),) 175 score = models.SmallIntegerField(choices=score_choices) 176 memo = models.TextField(blank=True,null=True) #备注 177 date = models.DateField(auto_now_add=True) 178 179 def __str__(self): 180 return "%s %s %s" % (self.student,self.course_record,self.score) 181 182 class Meta: 183 unique_together = ('student', 'course_record') 184 verbose_name_plural = "学习记录" 185 186 187 class Enrollment(models.Model): 188 '''报名表''' 189 customer = models.ForeignKey('Customer') #对应客户 190 enrolled_class = models.ForeignKey('ClassList',verbose_name='所报班级') 191 consultant = models.ForeignKey('UserProfile',verbose_name='课程顾问') 192 contreact_agreed = models.BooleanField(default=False,verbose_name='学生已赞成条款') 193 contract_approvaed = models.BooleanField(default=False,verbose_name='合同已审核') 194 date = models.DateTimeField(auto_now_add=True) 195 196 def __str__(self): 197 return '%s %s'%(self.customer,self.enrolled_class) 198 199 class Meta: 200 unique_together = ('customer','enrolled_class') 201 verbose_name_plural = "报名表" 202 203 class Payment(models.Model): 204 '''缴费记录''' 205 customer = models.ForeignKey('Customer') #客户 206 course= models.ForeignKey('Course',verbose_name='所报课程') 207 amount = models.PositiveIntegerField(verbose_name='数额',default=500) 208 consultant = models.ForeignKey('UserProfile') 209 date= models.DateTimeField(auto_now_add=True) 210 211 def __str__(self): 212 return '%s %s'%(self.customer,self.amount) 213 214 class Meta: 215 verbose_name_plural = "缴费记录" 216 217 class UserProfile(models.Model): 218 '''教师帐号表''' 219 user = models.OneToOneField(User) 220 name = models.CharField(max_length=32) 221 roles = models.ManyToManyField('Role',blank=True) 222 223 def __str__(self): 224 return self.name 225 226 class Meta: 227 verbose_name_plural = "教师帐号表" 228 229 class Role(models.Model): 230 '''角色表''' 231 name = models.CharField(max_length=32,unique=True) 232 menus = models.ManyToManyField('Menu',blank=True ) 233 234 def __str__(self): 235 return self.name 236 class Meta: 237 verbose_name_plural = "角色表" 238 239 class Menu(models.Model): 240 241 '''菜单''' 242 name = models.CharField(max_length=32) 243 url_name = models.CharField(max_length=64) 244 245 def __str__(self): 246 return self.name 247 248 class Meta: 249 verbose_name_plural = "菜单"
from django.db import models from django.contrib.auth.models import User # Create your models here. class Customer(models.Model): '''客户信息表''' name = models.CharField(max_length=32,blank=True,null=True) qq = models.CharField(max_length=64,unique=True) qq_name = models.CharField(max_length=64,blank=True,null=True) phone = models.CharField(max_length=64,blank=True,null=True) source_choices = ((0,'转介绍'), (1,'QQ群'), (2,'官网'), (3,'百度推广'), (4,'51CTO'), (5,'知乎'), (6,'市场推广') ) source = models.SmallIntegerField(choices=source_choices) referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True) consult_course = models.ForeignKey("Course",verbose_name="咨询课程") content = models.TextField(verbose_name="咨询详情") tags = models.ManyToManyField("Tag",blank=True,null=True) status_choices = ((0,'已报名'), (1,'未报名'), ) status = models.SmallIntegerField(choices=status_choices,default=1) consultant = models.ForeignKey("UserProfile") memo = models.TextField(blank=True,null=True) date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.qq class Meta: verbose_name ="客户表" verbose_name_plural ="客户表" class Tag(models.Model): name = models.CharField(unique=True,max_length=32) def __str__(self): return self.name class Meta: verbose_name = "标签" verbose_name_plural = "标签" class CustomerFollowUp(models.Model): '''客户跟进表''' customer = models.ForeignKey("Customer") content = models.TextField(verbose_name="跟进内容") consultant = models.ForeignKey("UserProfile") intention_choices = ((0,'2周内报名'), (1,'1个月内报名'), (2,'近期无报名计划'), (3,'已在其它机构报名'), (4,'已报名'), (5,'已拉黑'), ) intention = models.SmallIntegerField(choices=intention_choices) date = models.DateTimeField(auto_now_add=True) def __str__(self): return "<%s : %s>" %(self.customer.qq,self.intention) class Meta: verbose_name = "客户跟进记录" verbose_name_plural = "客户跟进记录" class Course(models.Model): '''课程表''' name = models.CharField(max_length=64,unique=True) price = models.PositiveSmallIntegerField() period = models.PositiveSmallIntegerField(verbose_name="周期(月)") outline = models.TextField() def __str__(self): return self.name class Meta: verbose_name = "课程表" verbose_name_plural = "课程表" class Branch(models.Model): '''校区''' name = models.CharField(max_length=128,unique=True) addr = models.CharField(max_length=128) def __str__(self): return self.name class Meta: verbose_name = "校区" verbose_name_plural = "校区" class ClassList(models.Model): '''班级表''' branch = models.ForeignKey("Branch",verbose_name="校区") course = models.ForeignKey("Course") class_type_choices = ((0,'面授(脱产)'), (1,'面授(周末)'), (2,'网络班') ) class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="班级类型") semester = models.PositiveSmallIntegerField(verbose_name="学期") teachers = models.ManyToManyField("UserProfile") start_date = models.DateField(verbose_name="开班日期") end_date = models.DateField(verbose_name="结业日期",blank=True,null=True) def __str__(self): return "%s %s %s" %(self.branch,self.course,self.semester) class Meta: unique_together = ('branch','course','semester') verbose_name_plural = "班级" verbose_name = "班级" class CourseRecord(models.Model): '''上课记录''' from_class = models.ForeignKey("ClassList",verbose_name="班级") day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") teacher = models.ForeignKey("UserProfile") has_homework = models.BooleanField(default=True) homework_title = models.CharField(max_length=128,blank=True,null=True) homework_content = models.TextField(blank=True,null=True) outline = models.TextField(verbose_name="本节课程大纲") date = models.DateField(auto_now_add=True) def __str__(self): return "%s %s" %(self.from_class,self.day_num) class Meta: unique_together = ("from_class", "day_num") verbose_name_plural = "上课记录" class StudyRecord(models.Model): '''学习记录''' student = models.ForeignKey("Enrollment") course_record = models.ForeignKey("CourseRecord") attendance_choices = ((0,'已签到'), (1,'迟到'), (2,'缺勤'), (3,'早退'), ) attendance = models.SmallIntegerField(choices=attendance_choices,default=0) score_choices = ((100,"A+"), (90,"A"), (85,"B+"), (80,"B"), (75,"B-"), (70,"C+"), (60,"C"), (40,"C-"), (-50,"D"), (-100,"COPY"), (0,"N/A"), ) score = models.SmallIntegerField(choices=score_choices,default=0) memo = models.TextField(blank=True,null=True) date = models.DateField(auto_now_add=True) def __str__(self): return "%s %s %s" %(self.student,self.course_record,self.score) class Meta: unique_together = ('student','course_record') verbose_name_plural = "学习记录" class Enrollment(models.Model): '''报名表''' customer = models.ForeignKey("Customer") enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级") consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问") contract_agreed = models.BooleanField(default=False,verbose_name="学员已赞成合同条款") contract_approved = models.BooleanField(default=False,verbose_name="合同已审核") date = models.DateTimeField(auto_now_add=True) def __str__(self): return "%s %s" %(self.customer,self.enrolled_class) class Meta: unique_together = ("customer","enrolled_class") verbose_name_plural = "报名表" class Payment(models.Model): '''缴费记录''' customer = models.ForeignKey("Customer") course = models.ForeignKey("Course",verbose_name="所报课程") amount = models.PositiveIntegerField(verbose_name="数额",default=500) consultant = models.ForeignKey("UserProfile") date = models.DateTimeField(auto_now_add=True) def __str__(self): return "%s %s" %(self.customer,self.amount) class Meta: verbose_name_plural = "缴费记录" class UserProfile(models.Model): '''帐号表''' user = models.OneToOneField(User) name = models.CharField(max_length=32) roles = models.ManyToManyField("Role",blank=True,null=True) def __str__(self): return self.name class Role(models.Model): '''角色表''' name = models.CharField(max_length=32,unique=True) menus = models.ManyToManyField("Menu",blank=True) def __str__(self): return self.name class Meta: verbose_name_plural = "角色" class Menu(models.Model): '''菜单''' name = models.CharField(max_length=32) url_name = models.CharField(max_length=64) def __str__(self): return self.name
admin设置
from django.contrib import admin from crm.models import * # Register your models here. class CustomerAdmin(admin.ModelAdmin): list_display = ('id','qq','source','consultant','content','status','date') list_filter = ('source','consultant','date') search_fields = ('qq','name') raw_id_fields = ('consult_course',) filter_horizontal = ('tags',) list_editable = ('status',) admin.site.register(Customer,CustomerAdmin) class UserProfileAdmin(admin.ModelAdmin): list_display = ('user','name') admin.site.register(CustomerFollowUp) admin.site.register(Enrollment) admin.site.register(Course) admin.site.register(ClassList) admin.site.register(CourseRecord) admin.site.register(Branch) admin.site.register(Role) admin.site.register(Payment) admin.site.register(StudyRecord) admin.site.register(Tag) admin.site.register(UserProfile,UserProfileAdmin) admin.site.register(Menu)
templates设置
Base.html 继承,指页面模板。外面一层永不变的页面
{%block 自定义变量 %}
{%endblock%}
<!DOCTYPE html> <!-- saved from url=(0041)http://v3.bootcss.com/examples/dashboard/ --> <html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其余内容都*必须*跟随其后! --> <meta name="description" content=""> <meta name="author" content=""> <link rel="icon" href="http://v3.bootcss.com/favicon.ico"> <title>Dashboard Template for Bootstrap</title> <!-- Bootstrap core CSS --> <link href="/static/css/bootstrap.min.css" rel="stylesheet"> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> <link href="/static/css/ie10-viewport-bug-workaround.css" rel="stylesheet"> <!-- Custom styles for this template --> <link href="/static/css/dashboard.css" rel="stylesheet"> <!-- Just for debugging purposes. Don't actually copy these 2 lines! --> <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]--> <script src="/static/js/ie-emulation-modes-warning.js"></script> <![endif]--> </head> {% block content %} {% endblock %} <!-- Bootstrap core JavaScript ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="/static/js/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script> <script src="/static/js/bootstrap.min.js"></script> <!-- Just to make our placeholder images work. Don't actually copy the next line! --> <script src="/static/js/holder.min.js"></script> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> <script src="/static/js/ie10-viewport-bug-workaround.js"></script> </html>
index.html 常常变化的模板 指参数,显示再图形上的页面
再view上设置是index页面
引入bese.html就能够了
引入方式 是 {% extends ‘base.html’%} 就能够了 中间 用 block包裹起来
URL设置
url分类 crm的单独作一层连接 ,perfectCRM作一层,再后者上用include 包裹crm的url ,再crm里作url
。。。。