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 自定义的更多相关文章

  1. python_way ,自定义session

    python_way ,自定义session container = {} #可以是数据库,可以是缓存也可以是文件 class Session: def __init__(self, handler) ...

  2. python_way day11 自定义线程池

    python_way day11 线程池 为什么需要线程池 线程多一些固然好,但是过多的线程反倒影响系统的负荷,所以我们就需要创建合适多的线程,哪我们把线程放到哪里?这时就放到线程池中. 线程池中存放 ...

  3. python_way ,day23 API

    python_way ,day23 1.api认证  .api加密动态请求 2.自定义session 一.api认证 首先提供api的公司,如支付宝,微信,都会给你一个用户id,然后还会让你下一个SD ...

  4. python_way ,day22 tonardo

    python_way day22 1.tonardo 2.cookie 3.api认证 一.tonardo: a.tonardo 初识 #!/usr/bin/env python3# Created ...

  5. python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法

    python_way day18 html-day4 1.Django-路由系统   - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...

  6. python_way day17 html-day3 前端插件(fontawsome,easyui,bootstrap,jqueryui,bxslider,jquerylazyload),web框架

    python_way day17 一.模板插件 图标的插件 fontawsome: 后台管理: easyui jqueryui 很多网站都会用: bootstrap :引入jQuery:(2.x,1. ...

  7. python_way day17 jQuery表单验证,事件绑定,插件,文本框架,正则表达式

    python_way day17 1.jQuery表单验证 dom事件绑定 jquery事件绑定 $.each return值的判断 jquery扩展方法 2.前段插件 3.jDango文本框架 4. ...

  8. python_way day16 DOM

    Python_way day16 1.Dom  (找到html中的标签) 一.DOM 1.查找元素 直接查找 document.getElementById 根据ID获取一个标签 --->这里是 ...

  9. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

随机推荐

  1. centos7 挂载数据盘

    centos 挂载数据盘1.运行 fdisk -l 命令查看数据盘.注意:在没有分区和格式化数据盘之前,使用 df -h 命令是无法看到数据盘的. 如果执行了 fdisk -l 命令后,没有发现 /d ...

  2. ArcGIS Server 增加缓存路径

    Server缓存服务,由于缓存文件经常比较大,默认放在C盘下容易导致磁盘空间不够,因此Server提供了增加缓存路径的方法来解决该问题. 增加的路径有两种,一种是Server所在服务器增加一个和原缓存 ...

  3. Postgre cannot insert multiple commands into a prepared statement

    悲剧... FireDAC连接Postgre数据库, 使用默认的属性, 一次执行多条SQL的时候, 会报"cannot insert multiple commands into a pre ...

  4. 64位win10系统无法安装.Net framework3.5的解决方法

    前言 Win10不会自带安装.net framework 3.5,而很多软件必须基于.net framework 3.5 sp1(例如:Sql Server 2014),从官网上下载的.net fra ...

  5. What is the difference between parameterized queries and prepared statements?

    Both parameterized queries and prepared statements are exactly the same thing. Prepared statement se ...

  6. List<T> 添加 DataTable

    public System.Data.DataTable getDataTable() { System.Data.DataTable dt = new System.Data.DataTable() ...

  7. [QGLViewer]First Demo

    Dependencies: QGLViewer2.6.3 Win7 64bit VS2010 直接使用QGLViewer文件夹下的Pro文件在VS2010中可以编译成64位的Dll. 用外面的libQ ...

  8. XML中文本节点存储任意字符的方法

    XML xml是一种可扩展标签语言, 为众多浏览器支持解析, ajax更是利用xml来完成服务器和客户端之前的通信. xml基本元素为 <label>xxx</label>, ...

  9. PHP js使用ajax异步处理方式请求PHP,解决数组中文乱码

    html端: <html> <head> <script type="text/javascript" src="jquery/jquery ...

  10. Android中悬浮窗口

    调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据Wind ...