一、项目环境

  • 语言: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. 学习web前端技术的笔记,仅供自己查阅备忘,移动对font-size的控制(并非原创)

    假设根字体font-size的值是40px, 640/40=16,16就是px换算rem的值 function initHtmlFontSize(){ //获取可可视屏幕的宽度 var _width= ...

  2. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  3. chrome浏览器使用技巧

    在学校的时候一直在用firefox火狐浏览器,听一个学长说使用chrome浏览器在面试的时候有加分,而且还跟我说了一些chrome浏览器的使用技巧,最后从火狐浏览器转到谷歌浏览器,就一直在使用谷歌浏览 ...

  4. qt中moc的作用

    Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉.完成这一操作的就是 moc. moc 全称是 Meta-Object Compiler,也就是"元对 ...

  5. JavaSE笔记-异常

    Java 异常 Throwable类的体系结构(一些常用的) 异常分类 checked,unchecked 区分:RuntimeException及其子类,Error类及其子类,是unchecked ...

  6. ubuontu16.04安装Opencv库引发的find_package()错误信息处理及其简单使用

    在安装完Opencv库之后,打算测试一下Opencv库是否成功安装.下面是用的例子对应的.cpp代码以及对应的CMakeLists.txt代码: .cpp文件: #include <stdio. ...

  7. 数据库连接池(c3p0)

    (一)问题的提出: 在使用开发基于数据库的web程序时,传统的数据库使用模式按照以下步骤: 在程序中建立数据库连接 进行sql操作 断开数据库连接 但是,这种模式存在着移动的问题: 传统连接模式每次向 ...

  8. Spring Boot实战:拦截器与过滤器

    一.拦截器与过滤器 在讲Spring boot之前,我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,A ...

  9. PowerShell 异常处理

    在使用 PowerShell 的过程中,发现它的异常处理并不像想象中的那么直观,所以在这里总结一下. Terminating Errors 通过 ThrowTerminatingError 触发的错误 ...

  10. 百度Apollo 尝试

    从Git-Hub上下载了Apollo源码在Ubuntu上准备运行一下 完成了以下步骤: bash docker/scripts/install_docker.sh bash docker/script ...