Python开发【Django】:Admin配置管理
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:\Users\L\PycharmProjects\s14\homework\CmdbManage>python manage.py makemigrations
C:\Users\L\PycharmProjects\s14\homework\CmdbManage>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:\Users\L\PycharmProjects\s14\homework\CmdbManage>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>
login.html
数据库表结构:
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
models.py
注册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)
显示效果:
Python开发【Django】:Admin配置管理的更多相关文章
- [系统开发] Django Admin上传图片简单校验
我的 models里有个ImageField字段,用来保存用户头像,希望通过Django Admin上传时校验头像大小,如果太大就报错,并且不保存. 网上有不少方法,有的通过第三方软件实现,有的通过自 ...
- python+pycharm+django admin css样式出问题
最近打算学习一下Python,基础知识有了大概的了解,想上手搞搞东西. 我用的python 3.5+pycharm+django 1.11.2 在使用Django,打开127.0.0.1:8000/a ...
- python之Django admin总结
一.Django内置admin a.配置路由 urlpatterns = [ url(r'^admin/', admin.site.urls), ] b.定制admin 在admin.py中 ...
- Python开发入门与实战2-第一个Django项目
2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Python开发【第二十一篇】:Web框架之Django【基础】
Python开发[第二十一篇]:Web框架之Django[基础] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...
- Python开发【第十八篇】Web框架之Django【基础篇】
一.简介 Python下有许多款不同的 Web 框架,Django 是重量级选手中最有代表性的一位,许多成功的网站和APP都基于 Django. Django 是一个开放源代码的Web应用框架,由 P ...
- Python自动化开发 - Django【进阶篇】
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Python开发【Django】:Model操作(一)
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
随机推荐
- HttpClient传递Cookie
使用代码访问http资源,我们通常用WebRequest,当然,HttpClient提供了更方便的封装,我用得更多.只是碰到一些需要(cookie)鉴权的情况,需要把cookie伴随请求一起发到服务器 ...
- 浅谈session测试
Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问.Session 允许通过将对象存储在 Web 服务器的内存中在整个用户会话过 ...
- DropDownList添加客户端下拉事件操作
如果要想给 DropDownList 服务器控件添加客户端下拉事件,我们可以强制给它添加 onchange 事件,尽管在控件中没有这个方法的提示.添加完这个事件还不能达到目的,还要设置 AutoPos ...
- 启用lazyload插件,减少图片加载
使用lazyload的js插件,减少图片加载,提高页面加载速度和节省流量.虽然这个头像是第三方服务器来的,不消费博客的流量,但是能节省部分访客的加载时间,也是不错的哦. 用lazyload插件,只是后 ...
- ssh在本地调用远程主机上的命令,不登录远程主机shell
需求描述: 在实际shell脚本的编写过程中,需要通过ssh远程执行一个命令,并返回执行的结果 简单来说,就是将命令发送到远程的主机上进行执行,但是并没有实际的登录到远程主机上.即通过 ssh的方式本 ...
- Rollup 与 webpack的区别
特性: webpack 拆分代码, 按需加载: Rollup 所有资源放在同一个地方,一次性加载,利用 tree-shake 特性来剔除项目中未使用的代码,减少冗余,但是webpack2已经逐渐支持t ...
- Mac普通用户修改了/etc/sudoers文件的解决办法
1.开启 Root 账户 打开“系统偏好设置”,进入“用户与群组”面板,记得把面板左下角的小锁打开,然后选择面板里的“登录选项”.在面板右边你会看到“网络账户服务 器”,点击它旁边的“加入…”按钮,再 ...
- hadoop程序MapReduce之DataSort
需求:对文件中的数据进行排序. 样本:sort.log 10 13 10 20 输出:1 10 2 10 3 13 4 20 分析部分: mapper分析: 1.<k1,v1>k1代表:行 ...
- storm中的基本概念
Storm是一个流计算框架,处理的数据是实时消息队列中的,所以需要我们写好一个topology逻辑放在那,接收进来的数据来处理,所以是通过移动数据平均分配到机器资源来获得高效率. Storm的优点是全 ...
- VS2015编译JPEG9b源码
输入:nmake -f makefile.vc libjpeg.lib 出现错误:找不到win32.mak文件 按照网上说的,这个win32.mak可以在C:\Program Files (x86)\ ...