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 #自定义的数据库模版

导入模块的

原文地址:https://www.cnblogs.com/noube/p/6498179.html