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 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
随机推荐
- Ironic , Openstack Baremetal Hypervisor
Ironic , Openstack Baremetal Hypervisor,首发于UnitedStack Inc.. 转自: http://ju.outofmemory.cn/entry/4876 ...
- Prime is problem - 素数环问题
题目描述: A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each ...
- UltraEdit-32 查看编码
一直苦于无法判断文件的编码类型,现在发现一个方法,就是用强大的UltraEdit-32软件: UltraEdit-32的状态栏可以显示文件的编码类型,详细情况如下: ANSCI------------ ...
- PureMVC--一款多平台MVC框架
官网:http://puremvc.org/ 下载:https://github.com/PureMVC/puremvc-csharp-multicore-framework/tree/1.1.0 A ...
- Strut2------配置环境
1.导入必要的包 2.在src目录下新建struts.xml文件 <?xml version="1.0" encoding="UTF-8" ?> & ...
- JBPM4.4_执行流程实例
1. 执行流程实例 1.1. 启动流程实例 说明:流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留. 1.1.1. 示例代码1:使用指定key的最新版本的流程定义启动流程实例 Pro ...
- django 错误分类及解决办法汇总
问题1:启动服务器后浏览器无法访问http://localhost:8000,访问被拒绝
- SaltStack 如何自定义 grains 信息
首先在 minion 上编辑 grains 配置文件,然后添加自定义的 grains: [root@localhost ~]$ cat /etc/salt/grains # 这个文件默认是没有的 ro ...
- thinkjs——两表联查
问题来源: 现有一张texture以及一张tradename表,两者的联系是texture表中有一字段名为tid对应tradename表中的id,而tradename表中却有一字段type,要求根据t ...
- lua知识点整理
1. lua全局环境和局部环境 local cf = loadstring(" local i=0 i=i+1 print(i) ") --从后面两个输出我们可以看出,生成的函数的 ...