Admin创建登录用户
数据库结构表:
from django.db import models # Create your models here. class UserProfile(models.Model): ''' 用户信息 ''' name = models.CharField(u'姓名',max_length=32) email = models.EmailField(u'邮箱') telephone = models.CharField(u'座机',max_length=32) mobile = models.IntegerField(u'手机') class Meta: verbose_name_plural = '用户信息表'
settings文件注册app,然后执行命令:
C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py makemigrations C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py migrate
admin.py文件中注册modlels:
from django.contrib import admin from repository import models # Register your models here. admin.site.register(models.UserProfile)
最后生成admin登录用户密码:
C:UsersLPycharmProjectss14homeworkCmdbManage>python manage.py createsuperuser
结果:
利用Admin进行用户验证
html登录页面:
<div class="container"> <form class="form-signin" method="POST"> {% csrf_token %} <h2 class="form-signin-heading">PerfectCRM Login</h2> <label for="username" class="sr-only"></label> <input type="text" id="username" class="form-control" name="username" placeholder="Username" required autofocus> <label for="inputPassword" class="sr-only"></label> <input type="password" id="inputPassword" class="form-control" name="password" placeholder="Password" required> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> </form> </div>
数据库表结构:
from django.contrib.auth.models import User class UserProfile(models.Model): '''员工用户表''' user = models.OneToOneField(User) #关联django Admin user name = models.CharField(max_length=32) roles = models.ManyToManyField("Role") class Meta: verbose_name_plural = '用户表' def __str__(self): return self.name
处理函数:
from django.shortcuts import render,redirect from django.contrib.auth import authenticate from django.contrib.auth import login,logout def acc_login(request): '''登录''' if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') # 利用django自带的认证系统进行系统认证 正确返回user对象 错误返回None user = authenticate(username=username,password=password) if user: #print(user.userprofile.name) 打印对象内的信息 login(request,user) # 认证成功后自动添加到session中,前端通过request可直接调用 return redirect('/crm') return render(request,'login.html') def acc_logout(request): logout(request) #情况session登录信息 return redirect('/login')
登录后前端进行调用{{ request.user.userprofile.name }},利用Admin进行用户关联认证后,还可以用到下面装饰器认证的方法
自带装饰器认证:
from django.shortcuts import render from django.shortcuts import HttpResponse from django.contrib.auth.decorators import login_required @login_required def dashboard(request): return render(request,'crm/dashboard.html')
settings配置:
# login_required 认证失败后的跳转地址 默认跳转地址为http://127.0.0.1:8000/accounts/login/?next=/crm/ LOGIN_URL = '/login/'
自定义Admin表显示样式:
数据库表结构:
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) qq = models.CharField(max_length=64,unique=True) wechat = models.CharField(max_length=64,blank=True,null=True) age = models.PositiveIntegerField(blank=True,null=True) gender = models.PositiveIntegerField(choices=((0,'Female'),(1,'Male')),blank=True,null=True) phone = models.PositiveIntegerField(blank=True,null=True) #正整数 source_choices = ( (0,'Baidu商桥'), (1,'51CTO'), (2,'QQ群'), (3,'知乎'), (4,'SOGO'), (5,'转介绍'), (6,'其他'), ) source = models.SmallIntegerField(choices=source_choices) # get_source_display 显示具体内容 referral_from = models.ForeignKey('Customer',related_name='my_referrals',blank=True,null=True) # 自关联,字段可写slef,必须写related_name consult_courses = models.ManyToManyField(to='Course') status_choices = ( (0,'已报名'),(1,'未报名'),(2,'已退学'),(3,'其他') ) status = models.SmallIntegerField(choices=status_choices) consultant = models.ForeignKey(to="UserProfile",verbose_name='课程顾问') consult_content = models.TextField(max_length=1024) data = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural = '客户表' def __str__(self): return self.name class Enrollment(models.Model): '''注册用户''' customer = models.ForeignKey('Customer') class_grade = models.ForeignKey('ClassList') enrollment_date = models.DateField() class Meta: unique_together = ('customer', 'class_grade') #联合唯一 verbose_name_plural = '注册用户表' def __str__(self): return self.customer class FollowUpRecord(models.Model): '''销售跟进记录''' customer = models.ForeignKey('Customer') content = models.TextField(max_length=1024) status_choices = ( (0,'绝无报名计划'), (1,'一个月内报名'), (2,'两周内报名'), (3,'已报其他机构'), ) status = models.SmallIntegerField(choices=status_choices) consultant = models.ForeignKey(to="UserProfile", verbose_name='课程顾问') data = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural = '跟进记录表' def __str__(self): return self.customer class Course(models.Model): '''课程Python,Go''' name = models.CharField(unique=True,max_length=32) price = models.PositiveIntegerField(default=19800) outline = models.TextField(max_length=1024) class Meta: verbose_name_plural = '课程表' def __str__(self): return self.name class ClassList(models.Model): '''班级s14,g1''' course = models.ForeignKey("Course") semester = models.PositiveIntegerField(verbose_name='学期') class_type_choices = ((0,'脱产'),(1,'周末'),(2,'网络')) branch = models.ForeignKey("Branch") class_type = models.PositiveIntegerField(choices=class_type_choices) teachers = models.ManyToManyField(to='UserProfile') start_date = models.DateField() end_date = models.DateField() class Meta: verbose_name_plural = '班级表' def __str__(self): return self.name class CourseRecord(models.Model): '''每节课上课记录''' class_grade = models.ForeignKey('ClassList') day_num = models.PositiveIntegerField(verbose_name='节次') teacher = models.ForeignKey('UserProfile') CourseContent = models.TextField(verbose_name="课程内容", max_length=1024) has_homework = models.BooleanField(default=True) #布尔类型 homework_title = models.CharField(max_length=128, blank=True, null=True) homework_requirement = models.TextField(verbose_name="作业需求", max_length=1024, blank=True, null=True) class Meta: unique_together = ("class_grade", "day_num") verbose_name_plural = '课节次表' def __str__(self): return " daynum:%s" % (self.day_number) class StudyRecord(models.Model): '''每个学生上的每节课的成绩记录''' course_record = models.ForeignKey("CourseRecord") student = models.ForeignKey("Enrollment") score_choices = ((100, "A+"), (90, "A"), (85, "B+"), (80, "B"), (75, "B-"), (70, "C+"), (65, "C"), (40, "C-"), (-20, "D"), (-50, "COPY"), (0, "N/A"), ) score = models.SmallIntegerField(choices=score_choices) show_status_choices = ( (0, "缺勤"), (1, "已签到"), (2, "迟到") ) show_status = models.SmallIntegerField(choices=show_status_choices) grade_comment = models.TextField(max_length=1024, blank=True, null=True) class Meta: unique_together = ("course_record", "student") verbose_name_plural = '学员成绩记录表' def __str__(self): return "%s daynum:%s" % (self.course_record, self.student) class UserProfile(models.Model): '''员工用户表''' user = models.OneToOneField(User) name = models.CharField(max_length=32) roles = models.ManyToManyField("Role") class Meta: verbose_name_plural = '用户表' def __str__(self): return self.name class Role(models.Model): """角色表""" name = models.CharField(unique=True,max_length=32) menus = models.ManyToManyField("Menu") class Meta: verbose_name_plural = '角色表' def __str__(self): return self.name class Branch(models.Model): """分校""" name = models.CharField(unique=True,max_length=128) class Meta: verbose_name_plural = '分校表' def __str__(self): return self.name class Menu(models.Model): """动态菜单""" name = models.CharField(unique=True,max_length=32) url_type = models.SmallIntegerField(choices=((0,'relative_name'),(1,'absolute_url'))) url_name = models.CharField(unique=True,max_length=128) class Meta: verbose_name_plural = '菜单表' def __str__(self): return self.name
注册admin:
class CustomerAdmin(admin.ModelAdmin): # 显示字段 按顺序排序 list_display = ('id', 'name', 'qq', 'consultant', 'source', 'consult_content', 'status', 'data') # filter过滤条件 list_filter = ('source', 'status', 'consultant') # 检索条件 search_fields = ('qq', 'name') # 直接在外部进行更改 list_editable = ('status',) # 字段只读 readonly_fields = ('name',) # 分页 list_per_page = 2 # 自定义actions方法 actions = ['action_test'] def action_test(self, request, querysets): querysets.update(status=0) admin.site.register(models.Customer, CustomerAdmin) admin.site.register(models.FollowUpRecord) admin.site.register(models.Enrollment) admin.site.register(models.Course) admin.site.register(models.ClassList) admin.site.register(models.StudyRecord) admin.site.register(models.UserProfile) admin.site.register(models.Branch) admin.site.register(models.Role) admin.site.register(models.Menu) admin.site.register(models.CourseRecord)
显示效果: