django 之admin后台管理

时间:2020-11-29 19:19:36

数据库

django 之admin后台管理django 之admin后台管理
  1 from django.db import models
2 from django.contrib.auth.models import User
3 from django.contrib.auth.models import (
4 BaseUserManager, AbstractBaseUser,PermissionsMixin
5 )
6 from django.utils.translation import ugettext_lazy as _
7 from django.utils.safestring import mark_safe
8
9 # Create your models here.
10
11
12 class Customer(models.Model):
13 '''客户信息表'''
14 name = models.CharField(max_length=32,blank=True,null=True,help_text="用户报名后请改为真实姓名")
15 qq = models.CharField(max_length=64,unique=True)
16 qq_name = models.CharField(max_length=64,blank=True,null=True)
17 phone = models.CharField(max_length=64,blank=True,null=True)
18 id_num = models.CharField(max_length=64,blank=True,null=True)
19 email = models.EmailField(verbose_name="常用邮箱",blank=True,null=True)
20 source_choices = ((0,'转介绍'),
21 (1,'QQ群'),
22 (2,'官网'),
23 (3,'百度推广'),
24 (4,'51CTO'),
25 (5,'知乎'),
26 (6,'市场推广')
27 )
28
29 source = models.SmallIntegerField(choices=source_choices)
30 referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True)
31
32 consult_course = models.ForeignKey("Course",verbose_name="咨询课程")
33 content = models.TextField(verbose_name="咨询详情")
34 tags = models.ManyToManyField("Tag",blank=True,null=True)
35 status_choices = ((0,'已报名'),
36 (1,'未报名'),
37 )
38 status = models.SmallIntegerField(choices=status_choices,default=1)
39 consultant = models.ForeignKey("UserProfile")
40 memo = models.TextField(blank=True,null=True)
41 date = models.DateTimeField(auto_now_add=True)
42
43 def __str__(self):
44 return "<%s %s>" %(self.qq,self.name)
45
46 class Meta:
47 verbose_name ="客户表"
48 verbose_name_plural ="客户表"
49
50 class Tag(models.Model):
51 name = models.CharField(unique=True,max_length=32)
52
53 def __str__(self):
54 return self.name
55
56 class Meta:
57 verbose_name = "标签"
58 verbose_name_plural = "标签"
59
60 class CustomerFollowUp(models.Model):
61 '''客户跟进表'''
62 customer = models.ForeignKey("Customer")
63 content = models.TextField(verbose_name="跟进内容")
64 consultant = models.ForeignKey("UserProfile")
65
66 intention_choices = ((0,'2周内报名'),
67 (1,'1个月内报名'),
68 (2,'近期无报名计划'),
69 (3,'已在其它机构报名'),
70 (4,'已报名'),
71 (5,'已拉黑'),
72 )
73 intention = models.SmallIntegerField(choices=intention_choices)
74 date = models.DateTimeField(auto_now_add=True)
75
76 def __str__(self):
77 return "<%s : %s>" %(self.customer.qq,self.intention)
78
79
80 class Meta:
81 verbose_name = "客户跟进记录"
82 verbose_name_plural = "客户跟进记录"
83
84 class Course(models.Model):
85 '''课程表'''
86 name = models.CharField(max_length=64,unique=True)
87 price = models.PositiveSmallIntegerField()
88 period = models.PositiveSmallIntegerField(verbose_name="周期(月)")
89 outline = models.TextField()
90
91 def __str__(self):
92 return self.name
93
94 class Meta:
95 verbose_name = "课程表"
96 verbose_name_plural = "课程表"
97
98 class Branch(models.Model):
99 '''校区'''
100 name = models.CharField(max_length=128,unique=True)
101 addr = models.CharField(max_length=128)
102 def __str__(self):
103 return self.name
104
105
106 class Meta:
107 verbose_name = "校区"
108 verbose_name_plural = "校区"
109
110 class ClassList(models.Model):
111 '''班级表'''
112 branch = models.ForeignKey("Branch",verbose_name="校区")
113 course = models.ForeignKey("Course")
114 class_type_choices = ((0,'面授(脱产)'),
115 (1,'面授(周末)'),
116 (2,'网络班')
117 )
118 contract = models.ForeignKey("ContractTemplate",blank=True,null=True)
119
120 class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="班级类型")
121 semester = models.PositiveSmallIntegerField(verbose_name="学期")
122 teachers = models.ManyToManyField("UserProfile")
123 start_date = models.DateField(verbose_name="开班日期")
124 end_date = models.DateField(verbose_name="结业日期",blank=True,null=True)
125
126 def __str__(self):
127 return "%s %s %s" %(self.branch,self.course,self.semester)
128
129 class Meta:
130 unique_together = ('branch','course','semester')
131 verbose_name_plural = "班级"
132 verbose_name = "班级"
133
134 class CourseRecord(models.Model):
135 '''上课记录'''
136 from_class = models.ForeignKey("ClassList",verbose_name="班级")
137 day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)")
138 teacher = models.ForeignKey("UserProfile")
139 has_homework = models.BooleanField(default=True)
140 homework_title = models.CharField(max_length=128,blank=True,null=True)
141 homework_content = models.TextField(blank=True,null=True)
142 outline = models.TextField(verbose_name="本节课程大纲")
143 date = models.DateField(auto_now_add=True)
144
145 def __str__(self):
146 return "%s %s" %(self.from_class,self.day_num)
147
148 class Meta:
149 unique_together = ("from_class", "day_num")
150 verbose_name_plural = "上课记录"
151
152
153 class StudyRecord(models.Model):
154 '''学习记录'''
155 student = models.ForeignKey("Enrollment")
156 course_record = models.ForeignKey("CourseRecord")
157 attendance_choices = ((0,'已签到'),
158 (1,'迟到'),
159 (2,'缺勤'),
160 (3,'早退'),
161 )
162 attendance = models.SmallIntegerField(choices=attendance_choices,default=0)
163 score_choices = ((100,"A+"),
164 (90,"A"),
165 (85,"B+"),
166 (80,"B"),
167 (75,"B-"),
168 (70,"C+"),
169 (60,"C"),
170 (40,"C-"),
171 (-50,"D"),
172 (-100,"COPY"),
173 (0,"N/A"),
174 )
175 score = models.SmallIntegerField(choices=score_choices,default=0)
176 memo = models.TextField(blank=True,null=True)
177 date = models.DateField(auto_now_add=True)
178
179 def __str__(self):
180 return "%s %s %s" %(self.student,self.course_record,self.score)
181
182 class Meta:
183 unique_together = ('student','course_record')
184 verbose_name_plural = "学习记录"
185
186
187 class Enrollment(models.Model):
188 '''报名表'''
189 customer = models.ForeignKey("Customer")
190 enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级")
191 consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问")
192 contract_agreed = models.BooleanField(default=False,verbose_name="学员已同意合同条款")
193 contract_approved = models.BooleanField(default=False,verbose_name="合同已审核")
194 date = models.DateTimeField(auto_now_add=True)
195
196 def __str__(self):
197 return "%s %s" %(self.customer,self.enrolled_class)
198
199 class Meta:
200 unique_together = ("customer","enrolled_class")
201 verbose_name_plural = "报名表"
202
203 class Payment(models.Model):
204 '''缴费记录'''
205 customer = models.ForeignKey("Customer")
206 course = models.ForeignKey("Course",verbose_name="所报课程")
207 amount = models.PositiveIntegerField(verbose_name="数额",default=500)
208 consultant = models.ForeignKey("UserProfile")
209 date = models.DateTimeField(auto_now_add=True)
210
211 def __str__(self):
212 return "%s %s" %(self.customer,self.amount)
213
214 class Meta:
215 verbose_name_plural = "缴费记录"
216
217 # class UserProfile(models.Model):
218 # '''账号表'''
219 # user = models.OneToOneField(User)
220 # name = models.CharField(max_length=32)
221 # roles = models.ManyToManyField("Role",blank=True,null=True)
222 #
223 # def __str__(self):
224 # return self.name
225
226
227 class ContractTemplate(models.Model):
228 '''合同模版'''
229 name = models.CharField("合同名称",max_length=64,unique=True)
230 template = models.TextField()
231
232 def __str__(self):
233 return self.name
234
235
236 class UserProfileManager(BaseUserManager):
237 def create_user(self, email, name, password=None):
238 """
239 Creates and saves a User with the given email, date of
240 birth and password.
241 """
242 if not email:
243 raise ValueError('Users must have an email address')
244
245 user = self.model(
246 email=self.normalize_email(email),
247 name=name,
248 )
249
250 user.set_password(password)
251 self.is_active = True
252 user.save(using=self._db)
253 return user
254
255 def create_superuser(self,email, name, password):
256 """
257 Creates and saves a superuser with the given email, date of
258 birth and password.
259 """
260 user = self.create_user(
261 email,
262 password=password,
263 name=name,
264 )
265 user.is_active = True
266 user.is_admin = True
267 user.save(using=self._db)
268 return user
269
270
271 class UserProfile(AbstractBaseUser,PermissionsMixin):
272 '''账号表'''
273 email = models.EmailField(
274 verbose_name='email address',
275 max_length=255,
276 unique=True,
277 null=True
278 )
279 password = models.CharField(_('password'), max_length=128,
280 help_text=mark_safe('''<a href='password/'>修改密码</a>'''))
281 name = models.CharField(max_length=32)
282 is_active = models.BooleanField(default=True)
283 is_admin = models.BooleanField(default=False)
284 roles = models.ManyToManyField("Role",blank=True)
285 objects = UserProfileManager()
286
287 stu_account = models.ForeignKey("Customer",verbose_name="关联学员账号",blank=True,null=True,
288 help_text="只有学员报名后方可为其创建账号")
289 USERNAME_FIELD = 'email'
290 REQUIRED_FIELDS = ['name']
291
292 def get_full_name(self):
293 # The user is identified by their email address
294 return self.email
295
296 def get_short_name(self):
297 # The user is identified by their email address
298 return self.email
299
300 def __str__(self): # __unicode__ on Python 2
301 return self.email
302
303 # def has_perm(self, perm, obj=None):
304 # "Does the user have a specific permission?"
305 # # Simplest possible answer: Yes, always
306 # return True
307 #
308 # def has_module_perms(self, app_label):
309 # "Does the user have permissions to view the app `app_label`?"
310 # # Simplest possible answer: Yes, always
311 # return True
312
313 @property
314 def is_staff(self):
315 "Is the user a member of staff?"
316 # Simplest possible answer: All admins are staff
317 return self.is_active
318
319
320 class Meta:
321 permissions = (('can_fuck_him_to_death','弄死小虎逼'),
322 ('can_access_my_course','可以访问我的课程'),
323 ('can_access_customer_list','可以访问客户列表'),
324 ('can_access_customer_detail','可以访问客户详细'),
325 ('can_access_studyrecords','可以访问学习记录页面'),
326 ('can_access_homework_detail','可以访问作业详情页面'),
327 ('can_upload_homework','可以交作业'),
328 ('access_kingadmin_table_obj_detail','可以访问kingadmin每个表的对象'),
329 ('change_kingadmin_table_obj_detail','可以修改kingadmin每个表的对象'),
330 )
331
332 class Role(models.Model):
333 '''角色表'''
334 name = models.CharField(max_length=32,unique=True)
335 menus = models.ManyToManyField("Menu",blank=True)
336
337 def __str__(self):
338 return self.name
339 class Meta:
340 verbose_name_plural = "角色"
341
342
343 class Menu(models.Model):
344 '''菜单'''
345 name = models.CharField(max_length=32)
346 url_type_choices = ((0,'alias'),(1,'absolute_url'))
347 url_type = models.SmallIntegerField(choices=url_type_choices,default=0)
348 url_name = models.CharField(max_length=64)
349
350 def __str__(self):
351 return self.name
models.py

 


admin配置

导入模块

from django.contrib import admin
from django.shortcuts import render,HttpResponse,redirect
from django import forms
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from crm import models #自定义的数据库模版

 

导入模块的