一、项目环境

  • 语言: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模型与站点管理的更多相关文章

  1. Django项目实践4 - Django站点管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

  2. 创建Django项目(三)——站点管理

    2013-08-05 21:01:34|         1.激活管理界面         (1) 修改"mysite\mysite\settings.py"文件,将'django ...

  3. Part 2:模型与后台管理admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  4. crm项目-stark组件分析

    ###############    stark组件     ################ """ 这个stark组件是非常神奇的 1,独立的一个组件 2,没有mod ...

  5. Django学习笔记(2)——模型,后台管理和视图的学习

    一:Web投票示例 本节我们首先从全局范围再复习一下Django的概念,让自己对Django的设计理念, 功能模块,体系架构,基本用法有初步的印象. Django初始的详细博客内容:请点击我 该应用包 ...

  6. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

  7. 11-Django站点管理

    站点管理 内容发布的部分由网站的管理员负责,包括查看.添加.修改.删除数据 开发这些重复的功能是一件单调乏味.缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块 在Django ...

  8. CRM项目讲解和django知识点回顾

    今天想把之前写的CRM项目梳理下,顺便回顾一下djiango的部分重要知识. 1.登录页面(包含简单验证码) 首先来看下CRM的登录页面,样式啥的不重要,大家可以去jquery ui的网站上或者其他地 ...

  9. [译]MVC网站教程(三):动态布局和站点管理

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.   自定义操作结果和控制器扩展 1)   OpenFileResult 2)   ImageR ...

随机推荐

  1. poj_3070Fibonacci(矩阵快速幂)

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12732   Accepted: 9060 Descri ...

  2. c++(堆排序)

    堆排序是另外一种常用的递归排序.因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用.堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的.打一个比方说,处于大堆中的每一个数据都必须满足这样一个 ...

  3. .NET MongoDB Driver 2.2 API注释

    主要内容 1 MongoClient 1.1构造函数 1.2 方法 2 IMongoDatabase 3 IMongoCollection 4 IMongoCollectionExtensions 5 ...

  4. 使用vue-axios请求geoJson数据报错的问题

    最近的项目用到了echarts一个带有散点地图的图表,按照正常jquery写法应该使用ajax请求geojson的数据动态去切换地图,就像下面这样 $.get('Js/map/' + cityData ...

  5. [学习OpenCV攻略][005][视频播放控制]

    cvSetCaptureProperty(视频,属性,属性值) 设置视频的属性,属性可以是宏CV_CAP_PROP_POS_FRAMES 视频帧的位置 cvGetCaptureProperty(视频, ...

  6. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  7. Redis进阶实践之五Redis的高级特性

    一.引言    上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性 ...

  8. HDU 2243 Knight Moves

    题目: A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find th ...

  9. 番外篇--Moddule Zero多租户管理

    番外篇--Moddule Zero多租户管理 2.1.1 关于多租户 强烈建议阅读这个文件前阅读多租户文档. 2.1.2 启用多租户 ASP.NET Boilerplate和module-zero可以 ...

  10. 算法-java代码实现计数排序

    计数排序   第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...