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 ...
随机推荐
- mysql5.5手册读书日记(1)
<?php //mysql语句使用技巧 /* * 我的数据库是5.5.2 * * 查询当前用户的登陆的名字 * select user(); * * 查询当前mysql服务器时间和服务器版本 * ...
- SQL Server执行计划的理解【转】
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看 ...
- javascript源代码学习之五——jQuery.deferred
jQuery.Defered——异步队列用于管理一组回调函数(成功resolve,失败reject,消息progress),基于上一节实现的jQuery.callbacks完成. done,fail, ...
- 使用复合索引代替单键索引,来避免单键有null值的情况
查看原表: SQL> select count(*) from t1; COUNT(*) ---------- 3229088 SQL> select count(*) from t1 w ...
- Latex常用指令学习
1:\begin{}与\end{}的用法 2:\textcolor{red}{\fangsong\zihao{2}汉字:} 3:\newpage 新的一页 4:\heiti\zihao{4}\bf{ ...
- 多列布局——column-width
column-width的使用和CSS中的width属性一样,不过不同的是,column-width属性在定义元素列宽的时候,既可以单独使用,也可以和多列属性中其他属性配合使用.其基本语法如下所示 : ...
- 修改 window.setTimeout,使之可以传递参数和对象参数
/* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 使用方法: setTimeout(回调函数,时间,参数1,,参数n) */ var _setTimeout=setTi ...
- google bookmarket api
引用: 最近做了google书签同步的模块,发现google并没有公开bookmark相关的api接口,在网上也找了些资料,通过自己抓包分析,测试,总结下使用bookmark接口的心得,我是在andr ...
- AppleWatch___学习笔记(一)开发思路和框架
一.开发须知 如果你没有开发过 iphone,直接来做watch,我建议你不要这么做,不是不可以,而是目前所有的第三方应用都必须基于iphone的扩展,原生的watch应用,苹果目前还没有开放给开发者 ...
- ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)
草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...
