python_way ,day26 django_admin 自定义
1、想在admin中增加新的字段如图:
默认django只显示 def __str__(self)里面的return的值
from django.contrib import admin # Register your models here.
from accets import models class NewAssetApprovalZoneAdmin(admin.ModelAdmin):
#自定义一个类,必须继承 admin.ModelAdmin
"""增加列数据"""
#list_display中的数据就是在models中设置的字段
list_display = ['sn', 'asset_type', 'os_type', 'model' ,"date", "approved"] admin.site.register(models.EventLog),
admin.site.register(models.Manufactory),
admin.site.register(models.Tag)
admin.site.register(models.NewAssetApprovalZone,NewAssetApprovalZoneAdmin)
class NewAssetApprovalZone(models.Model):
sn = models.CharField(u'资产SN号',max_length=128, unique=True)
asset_type_choices = (
('server', u'服务器'),
('switch', u'交换机'),
('router', u'路由器'),
('firewall', u'防火墙'),
('storage', u'存储设备'),
('NLB', u'NetScaler'),
('wireless', u'无线AP'),
('software', u'软件资产'),
('others', u'其它类'),
)
asset_type = models.CharField(choices=asset_type_choices,max_length=64,blank=True,null=True)
manufactory = models.CharField(max_length=64,blank=True,null=True)
model = models.CharField(max_length=128,blank=True,null=True)
ram_size = models.IntegerField(blank=True,null=True)
cpu_model = models.CharField(max_length=128,blank=True,null=True)
cpu_count = models.IntegerField(blank=True,null=True)
cpu_core_count = models.IntegerField(blank=True,null=True)
os_distribution = models.CharField(max_length=64,blank=True,null=True)
os_type = models.CharField(max_length=64,blank=True,null=True)
os_release = models.CharField(max_length=64,blank=True,null=True)
data = models.TextField(u'资产数据')
date = models.DateTimeField(u'汇报日期',auto_now_add=True)
approved = models.BooleanField(u'已批准',default=False)
approved_by = models.ForeignKey('UserProfile',verbose_name=u'批准人',blank=True,null=True)
approved_date = models.DateTimeField(u'批准日期',blank=True,null=True) def __str__(self):
return self.sn
class Meta:
verbose_name = '新上线待批准资产'
verbose_name_plural = "新上线待批准资产"
models
2、增加过滤功能
class NewAssetApprovalZoneAdmin(admin.ModelAdmin):
"""增加列数据"""
list_display = ['sn', 'asset_type', 'os_type', 'model' ,"date", "approved"]
list_filter = ('date', 'asset_type' ) admin.site.register(models.Asset),
admin.site.register(models.BusinessUnit),
admin.site.register(models.IDC),
admin.site.register(models.Server),
admin.site.register(models.NetworkDevice),
admin.site.register(models.NewAssetApprovalZone,NewAssetApprovalZoneAdmin)
3、只能在多对多的列中使用
======》
class AssetAdmin(admin.ModelAdmin):
list_display = ['name', 'sn', "asset_type", "create_date", "update_date" ]
filter_horizontal =('tag',) admin.site.register(models.Asset,AssetAdmin),
admin.site.register(models.BusinessUnit),
admin.site.register(models.IDC),
admin.site.register(models.Server),
admin.site.register(models.NetworkDevice),
tag就是models 中 Asset的一个列
4、增加下拉框选项:
class NewAssetApprovalZoneAdmin(admin.ModelAdmin):
"""增加列数据"""
list_display = ['sn', 'asset_type', 'os_type', 'model' ,"date", "approved"]
list_filter = ('date', 'asset_type',)
search_fields = ("sn", "os_type",) actions = ['apprpve_select_rows']
def apprpve_select_rows(self,*args,**kwargs):
print(args,kwargs)
#<WSGIRequest: POST '/admin/accets/newassetapprovalzone/'>, [<NewAssetApprovalZone: VMware-56 4d cd d3 b2 42 15 a5-7b 9a 7c 85 94 75 e4 df>
<WSGIRequest: POST '/admin/accets/newassetapprovalzone/'>, request对象
<NewAssetApprovalZone: VMware-56 4d cd d3 b2 42 15 a5-7b 9a 7c 85 94 75 e4 df> 在admin中选中的对象
5、自定义django用户认证
from django.contrib.auth.models import User class TestUser(AbstractBaseUser):
"""官网推荐的方法"""
user = models.OneToOneField(User)
name = models.CharField(max_length=32)
#此时用户就集成了Django User的功能
这么做有一些问题
1、在admin中创建用户必须要先执行以下user这个用户,然后才能在下面创建一个用户
2、在调用的时候需要通过user字段才能调用出username的字段
调用:
a = modules.UserProfile.objects.last()
a.user.username
- django User深度自定义
官网文档 搜索:custom authentication
继承的User是什么鬼
点进去瞅瞅
就能发现这个User就是继承的AbstractUser
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser
)
1、我们就先导入这个 使用其中的的AbstractBaseUser
UserProfile
class UserProfile(AbstractBaseUser): #自定义一个用户认证的类,继承 AbstractBaseUser,这里面会有密码字段,所以下面不用创建密码字段
"""自定义用户表"""
email = models.EmailField( #定义用户注册的类型为email 也可以定义为别的
verbose_name='email address',
max_length=255,
unique=True,
)
# date_of_birth = models.DateField()
name = models.CharField(max_length=64) #用户名
is_active = models.BooleanField(default=True) #是不是活跃
is_admin = models.BooleanField(default=False) #是不是管理员
bind_hosts = models.ManyToManyField('BindHost', blank=True)
host_groups = models.ManyToManyField('HostGroups', blank=True) objects = UserProfileManager() #关联UserProfileManager一个类 USERNAME_FIELD = 'email' #用户名字段
REQUIRED_FIELDS = ['name'] # 必须要有这个字段 def get_full_name(self):
# The user is identified by their email address
return self.email def get_short_name(self):
# The user is identified by their email address
return self.email def __str__(self): # __unicode__ on Python 2
return self.email def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True @property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
2、UserProfileManager (创建用户使用的类)
class UserProfileManager(BaseUserManager): #创建用户使用的类
def create_user(self, email, name, password=None):
"""
Creates and saves a User with the given email, date of
birth and password.
"""
if not email: #确认要有email
raise ValueError('Users must have an email address') user = self.model(
email=self.normalize_email(email), #判断邮件地址是否合法
# date_of_birth=date_of_birth,
name=name
) user.set_password(password) #加密密码
user.save(using=self._db)
return user def create_superuser(self, email, name, password): #通过命令行创建时会调用这里
"""
Creates and saves a superuser with the given email, date of
birth and password.
"""
user = self.create_user(
email,
password=password,
name=name,
)
user.is_admin = True #把用户类型admin 定义为True
user.save(using=self._db)
return user
3、让Django用自己写的这个UserProfile的用户认证,需要在setting中增加一个字段
AUTH_USER_MODEL = 'customauth.MyUser'
4、然后就执行
python3 manage.py makemigrations
如果之前执行创建过用户,就要把之前的User删除
成功以后,进入amdin中,看到用户的密码是密文的,但是自己添加是明文的,所以我们输入密码django就不能识别了。、
5、然后再写一个文件将django官网中的一段代码粘贴过来
名字随便起就可以
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from web.models import UserProfile #导入自定义的用户表 class UserCreationForm(forms.ModelForm): #创建用户
"""A form for creating new users. Includes all the required
fields, plus a repeated password."""
password1 = forms.CharField(label='Password', widget=forms.PasswordInput) #输入两次密码
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) class Meta:
model = UserProfile #这里指定之前自定义的UserProfile
fields = ('email', 'name','is_admin','bind_hosts', 'host_groups', ) #创建用户的时候需要输入的内容 - 1 def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords don't match")
return password2 def save(self, commit=True):
# Save the provided password in hashed format
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user class UserChangeForm(forms.ModelForm): #修改用户记录的时候显示的东西
"""A form for updating users. Includes all the fields on
the user, but replaces the password field with admin's
password hash display field.
"""
password = ReadOnlyPasswordHashField() class Meta:
model = UserProfile
fields = ('email', 'password', 'name', 'is_active', 'is_admin') def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial["password"] class UserAdmin(BaseUserAdmin):
# The forms to add and change user instances
form = UserChangeForm
add_form = UserCreationForm # The fields to be used in displaying the User model.
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'name', 'is_admin') #显示字段
list_filter = ('is_admin','name') #过滤字段
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Personal info', {'fields': ('name',)}),
('Permissions', {'fields': ('is_admin', 'bind_hosts', 'host_groups',)}), #点击修改用户时候显示的字段
)
# add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
# overrides get_fieldsets to use this attribute when creating a user.
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'name', 'password1', 'password2','bind_hosts', 'host_groups')} #创建新用户是需要填写那些字段内容 - 2
),
)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ('bind_hosts','host_groups') #可以拖拽的格式 # Now register the new UserAdmin...
admin.site.register(UserProfile, UserAdmin)
# ... and, since we're not using Django's built-in permissions,
# unregister the Group model from admin.
admin.site.unregister(Group)
6、在admin.py中注册custom_user_admin
7、然后将django这个用户认证可以用到我们的自己的业务中
a、在最后粘贴的新文件中导入UserProfile用户类 b、 UserCreationForm 类中
fields = ('email', 'name','is_admin','bind_hosts', 'host_groups', ) #创建用户的时候需要输入的内容 - 1
c、UserAdmin 类中
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Personal info', {'fields': ('name',)}),
('Permissions', {'fields': ('is_admin', 'bind_hosts', 'host_groups',)}), #点击修改用户时候显示的字段
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('email', 'name', 'password1', 'password2','bind_hosts', 'host_groups')} #创建新用户是需要填写那些字段内容 - 2
),
)
python_way ,day26 django_admin 自定义的更多相关文章
- python_way ,自定义session
python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...
- python_way day11 自定义线程池
python_way day11 线程池 为什么需要线程池 线程多一些固然好,但是过多的线程反倒影响系统的负荷,所以我们就需要创建合适多的线程,哪我们把线程放到哪里?这时就放到线程池中. 线程池中存放 ...
- python_way ,day23 API
python_way ,day23 1.api认证 .api加密动态请求 2.自定义session 一.api认证 首先提供api的公司,如支付宝,微信,都会给你一个用户id,然后还会让你下一个SD ...
- python_way ,day22 tonardo
python_way day22 1.tonardo 2.cookie 3.api认证 一.tonardo: a.tonardo 初识 #!/usr/bin/env python3# Created ...
- python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法
python_way day18 html-day4 1.Django-路由系统 - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...
- python_way day17 html-day3 前端插件(fontawsome,easyui,bootstrap,jqueryui,bxslider,jquerylazyload),web框架
python_way day17 一.模板插件 图标的插件 fontawsome: 后台管理: easyui jqueryui 很多网站都会用: bootstrap :引入jQuery:(2.x,1. ...
- python_way day17 jQuery表单验证,事件绑定,插件,文本框架,正则表达式
python_way day17 1.jQuery表单验证 dom事件绑定 jquery事件绑定 $.each return值的判断 jquery扩展方法 2.前段插件 3.jDango文本框架 4. ...
- python_way day16 DOM
Python_way day16 1.Dom (找到html中的标签) 一.DOM 1.查找元素 直接查找 document.getElementById 根据ID获取一个标签 --->这里是 ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
随机推荐
- eval 与 Function
var json='{"name":"lee","age":"15"}' function test () { var ...
- 响应式网站通用css
/* core.css v1.1 | MIT License | corecss.io */ html { font-family: sans-serif; font-size: 100%; line ...
- MyArrayAdapter 比较标准的写法
; i < mString.size(); i++) { insert(mString.get(i), i); } } notifyDataSetChanged(); LogUtils.LOGD ...
- Objective-C objc_class 介绍
目录(?)[-] Objective-C objc_class 介绍 NSObject objc_class isa super_class name version info instanc ...
- angularJs实现信息数据提交功能
如下简单的报名提交的实现 1.数据绑定 2.$http.post()提交数据 一.数据绑定 <!--报名部分--> <div class="attend_box" ...
- inittab 分析
内核初始化后,启动init进程/sbin/init,读取/etc/inittab文件进行初始化. 参考链接 http://wenku.baidu.com/view/5a82b5f67c1cfad619 ...
- DOM based XSS Prevention Cheat Sheet(DOM Based XSS防御检查单)
本文为翻译版本,原文请查看 https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet 介绍 谈到XSS攻击,有三种公认的 ...
- Fatal Error: TXK Install Service oracle.apps.fnd.txk.config.ProcessStateException: OUI process failed : Exit=255 See log for details
安装EBS的时候,database pre-install checks检查报警,显示"!" 一开始忽略了该报警,继续安装.在post-install checks的时候又报了错误 ...
- 学习JAVA的第一天。
今天上了JAVA的第一堂课,对<JAVA 面向对象编程>小看了2个单元,感觉难度还行,在自己的理解范围,应该都是基础,记得以前在学校里也听老师讲过课是根本没有用心. 相信自己一定能学好,J ...
- kali安装nautilus-open-terminal不起作用
apt-get install nautilus-open-terminal (鼠标右键在当前目录打开终端) 这个功能不起作用时,可以按如下操作,经试验有效! nautilus -q && ...