CRM项目-1模型与站点管理
一、项目环境
- 语言:python3
- IDE:pycharm
- 组件:bootstarp,jQuery
二、模型
2.1编写模型
联合唯一
class Meta:显示中文名。
认证使用django自带的User表,跟我们的用户表进行关联
from django.contrib.auth.models import User
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)
#32个字节,中文10个,第一次来不会告诉你为空,blank是在django-admin里面的限制。一般都是成对出现
qq = models.CharField(max_length=64,unique=True)
#以qq为主,可以是手机,微信
phone = models.CharField(max_length=64,blank=True,null=True)
source_choices = (
("","转介绍"),
("","QQ群"),
("","官网"),
("","百度推广"),
("","51CTO"),
("","知乎"),
("","市场推广"),
)
source = models.SmallIntegerField(choices=source_choices)
referral_name = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True)
#咨询的课程
consult_course = models.ForeignKey("Course", verbose_name="咨询课程")
#描述客户信息
content = models.TextField(verbose_name="咨询详情")
consultant = models.ForeignKey("UserProfile")
memo = models.TextField(blank=True,null=True)
tags = models.ManyToManyField("Tag",blank=True,null=True)
date = models.DateField(auto_now_add=True) def __str__(self):
return self.qq
class Meta:
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_plural = "标签表" class CustomerFollowUp(models.Model):
"""客户跟进表"""
customer = models.ForeignKey("Customer")
content = models.TextField("跟进内容")
consultant = models.ForeignKey("UserProfile")
intention_choices = (
(0,"两周内报名"),
(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,self.intention)
class Meta:
verbose_name_plural = "客户跟进表" class Course(models.Model):
"""课程表"""
name = models.CharField(max_length=64,unique=True)
price = models.PositiveIntegerField()
#周期
period = models.PositiveIntegerField(verbose_name="周期(月)")
outline = models.TextField()
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "课程表" class ClassList(models.Model):
"""班级表"""
branch = models.ForeignKey("Branch")
#创建班级的时候,关联课程
course = models.ForeignKey("Course")
class_type_choices = (
(0,"面授-脱产"),
(0,"面授-周末"),
(0,"面授-周末"),
)
class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="授课方式")
semester = models.PositiveSmallIntegerField("学期")
teachers = models.ManyToManyField("UserProfile")
star_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 = "班级表" 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_plural = "校区" 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_tittle = 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)
#使用数字便于统计
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)
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)#定金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):
"""账号表"""
"""跟djaogo的user表进行关联,这样认证等问题,就可以很简单的解决了"""
user = models.OneToOneField(User)
name = models.CharField(max_length=32)
roles = models.ManyToManyField("Role",blank=True,null=True)
class Meta:
verbose_name_plural = "账号表" class Role(models.Model):
"""角色表"""
name = models.CharField(max_length=32,unique=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "角色表"
模型
2.2 注册表
该注册表是为了在admin中可以显示该表。
from django.contrib import admin
from crm import models admin.site.register(models.Customer)
admin.site.register(models.CustomerFollowUp)
admin.site.register(models.Enrollment)
admin.site.register(models.Course)
admin.site.register(models.ClassList)
admin.site.register(models.CourseRecord)
admin.site.register(models.Branch)
admin.site.register(models.Role)
admin.site.register(models.Payment)
admin.site.register(models.StudyRecord)
admin.site.register(models.Tag)
admin.site.register(models.UserProfile)
2.3 数据库同步
Python manage.py makemigrations
python manage.py migrate
2.4 创建超级管理员
python manage.py createsuperuser
2.5 登入后台

2.6 数据显示

我们在模型中定义了很多字段,但是admin中只显示了一列。so 我们需要自定制admin
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','consultant')#可在信息表中直接修改 class UserProfileAdmin(admin.ModelAdmin):
list_display = ('user','name') admin.site.register(models.UserProfile,UserProfileAdmin)
admin.site.register(models.Customer,CustomerAdmin)
效果图如下,非常的明显:


CRM项目-1模型与站点管理的更多相关文章
- Django项目实践4 - Django站点管理(后台管理员)
http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...
- 创建Django项目(三)——站点管理
2013-08-05 21:01:34| 1.激活管理界面 (1) 修改"mysite\mysite\settings.py"文件,将'django ...
- Part 2:模型与后台管理admin站点--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- crm项目-stark组件分析
############### stark组件 ################ """ 这个stark组件是非常神奇的 1,独立的一个组件 2,没有mod ...
- Django学习笔记(2)——模型,后台管理和视图的学习
一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...
- CRM项目之RBAC权限组件-day26
写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...
- 11-Django站点管理
站点管理 内容发布的部分由网站的管理员负责,包括查看.添加.修改.删除数据 开发这些重复的功能是一件单调乏味.缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块 在Django ...
- CRM项目讲解和django知识点回顾
今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...
- [译]MVC网站教程(三):动态布局和站点管理
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. 自定义操作结果和控制器扩展 1) OpenFileResult 2) ImageR ...
随机推荐
- HDU2689-Sort it-冒泡排序
Sort it Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu_1018(斯大林公式/n!的位数)
题意:求大数n!的位数. 根据n! = (int)log(n!)+1 方法1: log(n!) = log(1*2*3*...*n) = log1+log2+...+logn 方法2: 斯大林公式: ...
- Team Queue(STL练习题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1387 Team Queue Time Limit: 2000/1000 MS (Java/Others ...
- .26-浅析webpack源码之事件流make(1)
compilation事件流中,依然只是针对细节步骤做事件流注入,代码流程如图: // apply => this-compilation // apply => compilation ...
- 关于富文本在Android中的应用以及遇到的坑
富文本可以为用户提供更加多样化的文本展示形式,但由于其使用了H5标签的特殊性,一般都需要第三方框架的支持.这里推荐一款合适的第三方富文本框架,richeditor. 首先我们要使用该功能需要引入相关j ...
- JavaScript 字符串与对象互换
对象转字符串: var str = JSON.stringify(obj); 字符串转对象: var str = JSON.parse(str);
- 优化 or 语句
mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip 对于 or 语句,如果要利用索引,则 or 之间的每个条件都必须有索引 renta ...
- linux mysql下忘记root密码解决办法
1 修改MySQL的登录设置 # vi /etc/my.cnf 在[mysqld]的中加上一句:skip-grant-tables 2 重新启动mysqld # /etc/init.d/mysqld ...
- 苹果系统css样式变化
原因:苹果自带样式覆盖了 参考文章比较详细,就不自己写了,copy了一份~~~ @参考文章 只要在样式里面加一句去掉css去掉iPhone.iPad的默认按钮样式就可以了!~ input[type=& ...
- Linux指令--chgrp
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...