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 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
随机推荐
- jQuery-处理class属性
1.addClass方法 为每个匹配的元素添加指定的样式类名 参数类型说明: 1)class名称(字符串) 每个匹配元素添加的一个或多个用空格隔开的样式名 2)function(index, curr ...
- 【python】通过代理安装包
1.安装setuptools 支持 pip install 或easy_install 2.在终端执行 set HTTP_PROXY=http://your.proxy.com:yourPort se ...
- 学习 TList 类的实现[8]
现在准备建立 Items 数组属性; 在 public 区输入下面代码:property Items[Index: Integer]: Pointer; 执行 Shift+Ctrl+C 后的代码是: ...
- JavaScript第五天之数组
<script> var a=[1,2,3]; //var a=new Array(1,2,3); //alert(a.length); alert(a[0]); </script& ...
- Makefile--伪目标 (三)
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件.我们在 ...
- [Android系列—] 4. 加入操作栏(Action Bar)
前言 操作栏是最重要的设计元素之中的一个,使用它来实现你的应用程序活动.通过提供多种用户界面功能, 使应用程序高速和其它的Andorid应用程序一致, 以便被用户熟悉和接受. 主要功能包括: 1. 标 ...
- HBase表的架构原理
HBase总体架构图 Hbase Table的基本单位是Region,一个Table相应多个Region.Table层级关系例如以下: Table (HBase table) Re ...
- MVC3--View层
Razor二义性: 1,当view层中出现 邮件格式时候比如 anbylau2130@qq.com 这种情况Razor将会出现多义性 可以使用@@来转义为一个@字符, 如:<p>y ...
- ios - UILabel全属性
label是大家在开发过程中使用频率很高的一个用来显示文本信息的控件,但是她所有的属性你都了解吗,下面让我们来 重新认识一下label! 1.创建 CGRect rect = CGRectMake(, ...
- hadoop程序MapReduce之DataDeduplication
需求:去掉文件中重复的数据. 样板:data.log 2016-3-1 a 2016-3-2 b 2016-3-2 c 2016-3-2 b 输出结果: 2016-3-1 a 2016 ...