
一、项目环境
- 语言: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)
效果图如下,非常的明显: