python_way ,day26 django_admin 自定义

摘要:
Null=True)数据=模型。TextField(u'Asset Data')日期=模型。DateTimeField(u'报告日期',auto_now_add=True)已批准=型号。BooleanField(u'Approved',默认值=False)Approved_by=models.ForeignKey('UserProfile',

1、想在admin中增加新的字段如图:

python_way ,day26 django_admin 自定义第1张 

 默认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)
python_way ,day26 django_admin 自定义第2张python_way ,day26 django_admin 自定义第3张
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、增加过滤功能

python_way ,day26 django_admin 自定义第4张

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、只能在多对多的列中使用

python_way ,day26 django_admin 自定义第5张       ======》     python_way ,day26 django_admin 自定义第6张

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

python_way ,day26 django_admin 自定义第7张

 继承的User是什么鬼

python_way ,day26 django_admin 自定义第8张 

点进去瞅瞅

python_way ,day26 django_admin 自定义第9张

就能发现这个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'

python_way ,day26 django_admin 自定义第10张

python_way ,day26 django_admin 自定义第11张

python_way ,day26 django_admin 自定义第12张

4、然后就执行
 python3 manage.py makemigrations

如果之前执行创建过用户,就要把之前的User删除  

成功以后,进入amdin中,看到用户的密码是密文的,但是自己添加是明文的,所以我们输入密码django就不能识别了。、

5、然后再写一个文件将django官网中的一段代码粘贴过来

名字随便起就可以

python_way ,day26 django_admin 自定义第13张

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

python_way ,day26 django_admin 自定义第14张

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 自定义》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇嵌入式Linux应用程序开发IOS管理文件和目录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

xadmin安装2

Django-xadmin的介绍 > `Django`是`python`的重量级web框架,写得少,做得多,非常适合后端开发,它很大的一个亮点是,自带后台管理模块,但它自带的后台管理有点丑,而`Xadmin`是基于`bootstrap`开发的一套后台管理框架,界面非常美观,只需几步就可以替换自带的`Django_admin` 具体的安装步骤 1. x...

Android之查看外部依赖jar的源代码_android private libralies does not allow modifications to source

在Eclipse中开发android的应用程序时,有时想查看函数的内部实现。可是当在函数上点击ctrl和鼠标左键的时候。 往往出现例如以下提示:  Class File Editor Source not found The JAR of this class file belongs to container 'Android'  which does...

前端缓存http请求

需求: 1、 重复的请求,使用缓存 2、 不重复的请求,允许发送 3、 连续两次重复的发送,两次返回的结果是一样的,且第二次不发送请求 1、搭建前端服务 vue-cli 一步到位  <template> <div class="hello"> <button v-on:click="getrs(1)">...

vue 点击展开显示更多 点击收起部分隐藏

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <style ty...

showdoc升级问题,showdoc错误日志

showdoc自带错误日志。目录位于网站根目录的server/Application/Runtime/Logs/Api目录下,如果没有任何内容需要添加可写权限。 showdoc升级后,建议把MySQL改成Sqlite,这里我们没改。后期出现了一系列问题,观察这个位置的日志就能解决。 建议升级的用户看一下网站根目录下server/Application/Ho...

dbus-python的API及示例

目录 1. Data types 2. Connecting to the Bus 3. Making method calls (同步调用) 3.1. Proxy objects 3.2. Interfaces and methods 4. Making asynchronous calls(异步调用) 4.1. Setting up an...