一、项目环境

  • 语言: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. cs231n spring 2017 lecture15 Efficient Methods and Hardware for Deep Learning 听课笔记

    1. 深度学习面临的问题: 1)模型越来越大,很难在移动端部署,也很难网络更新. 2)训练时间越来越长,限制了研究人员的产量. 3)耗能太多,硬件成本昂贵. 解决的方法:联合设计算法和硬件. 计算硬件 ...

  2. Codeforces-8VC Venture Cup 2016-Elimination Round-626A.暴力 626B.水题 626C.二分

    A. Robot Sequence time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. CF 615D Multipliers

    题目:http://codeforces.com/contest/615/problem/D 求n的约数乘积. 设d(x)为x的约数个数,x=p1^a1+p2^a2+……+pn^an,f(x)为x的约 ...

  4. bfs学习

    今天做到了bfs的练习,顺便写下心得... bfs能解决搜索和最短路径的问题. 下面是学习心得: typedef struct point //定义点 { int x; int y; }P; bfs( ...

  5. 通过案例理解position:relative和position:absolute

    w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点.position:relative和postion:abso ...

  6. 从XMLHttpRequest请求响应里getResponseHeader(header)报错:Refused to get unsafe header "**" 问题解决

    问题产生原因: 原因1:W3C的 xhr 标准中做了限制,规定客户端无法获取 response 中的 Set-Cookie.Set-Cookie2这2个字段,无论是同域还是跨域请求: 原因2:W3C ...

  7. java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition;

    http://stackoverflow.com/questions/6066054/whats-wrong-with-my-apache-cxf-client You likely have a 1 ...

  8. 使用layui在规定的期限内选择日期

    这几天碰到了layui中的日期与时间这个,本以为很简单的,可是又一个需求是这样的,有两个日期选择框,第一个日期选择框要求最小日期不得小于当前日期,第二个日期选择框要求最小日期为第一个日期选择框的选中日 ...

  9. Java Web学习路线图

    三张Java Web完整学习路线图,阶段一和JavaSE部分可不学

  10. 算法,java代码实现打印万年历

      万年历 以1900年1月1号星期一为时间原点 星期日 第一天 星期一 第二天 星期二 第三天 星期三 第四天 星期四 第五天 星期五 第六天 星期六 第七天            1.计算出当前日 ...