zoukankan      html  css  js  c++  java
  • django学习日志之自定义用户扩展

    django 为我们提供了强大的用户认证系统,并且提供了基于该系统的User模型,所以,很多时候,我们有必要对自己的user进行业务扩展,得到满足我们自己业务需求的user。借此,写下自己的感悟。

    user内置属性如下:

    username

    用户名,必需字段。30个字符或更少,包含 _, @, +, . 和 - 字符。

    first_name
    可选。 <=30字符.

    last_name
    可选。 <=30字符r.

    email
    邮箱,可选。 Email地址.

    password
    密码,必需。Django不是以明文存储密码的,而是存储哈希值。

    以及两个外键:

    groups
    用户组。

    user_permissions
    用户权限。

    很明显,这些很多时候是不够用的。

    但是,我学会了两种扩展方法。

    第一种,很明显我们用一对一关系就可以扩展自己的属性了吧,比如,我想要加个address地址属性。

    首先系统的User对象模型在django.contrib.auth.models里面,然后写自己的模型,建立一对一关系,我的代码如下

    #app里面的models模块
    from django.db import models
    from django.contrib.auth.models import User
    # Create your models here.
    class UserProfile(models.Model):
        user = models.OneToOneField(User)
        address = models.CharField(max_length=100)

    好makemigrations和migrate(关于迁移可以参考官方文档)进数据库先。

    admin应该知道吧,让我看看到底长什么样,于是,在控制台python manage.py createsuperuser创建个admin。

    长这样,当然不是我们希望的,这种扩展,不管用在什么时候,就算是自己对自己模型的扩展,也不是完美的,然而admin系统也提供了一些自定义的样式,应该说提供了很多。其中我们可以让两个模型一起显示吧。

    #原来的admin.py文件
    from django.contrib import admin
    from blog.models import *
    # Register your models here.
    
    admin.site.register(UserProfile)

    这是原来的admin,我修改成这样

    from django.contrib import admin
    from blog.models import *
    # Register your models here.
    class ProfileInline(admin.StackedInline):
        model = UserProfile
        verbose_name = 'profile'
    
    class UserAdmin(admin.ModelAdmin):
        inlines = (ProfileInline,)
    
    admin.site.register(User,UserAdmin)

    register第二个参数我们传了UserAdmin,意思是用一个自定义的admin模型来修饰,具体细节官方文档有很多,用inlines 修饰,这里写一个inlne类进去,就像上面的ProfileInline一样,我们想要插入的是模型填了我们扩展的UserProfile.然后定意思了一个verbose_name,这是它的名字,好了现在admin变成什么样了,我来看一下。

    对了,出错了,他说User已经注册了。所以我在admin.site.register上面加了一句admin.site.unregister(User),因为默认系统是注册了User对象。

    好再看看,成功!

    先上一页系统自己的row吧

    然后看看是否有扩展:

    可以看到我们自己的扩展地址:address栏,至此,也就扩展成功了。

    第二张方法,django模型系统,自带继承,我们可以用继承来实现。

     在models.py里面,我们写入如下模型,继承系统的AbstractUser

    这种方法和系统User的耦合度非常好

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    
    class User(AbstractUser):
        address = models.CharField(max_length=100)

    当然,系统默认还是自带的user,需要在setting文件里面把系统默认user替换写入如下语句

    blog是我的app名字,根据自己app设置

    然后在admin里面注册自己的User就行了。

    看看效果如何:

    address出现了,同时我们会发现这个User是在系统原来的User里的。

  • 相关阅读:
    Java中断机制
    RPC原理
    synchronized和ReentrantLock的区别
    dubbo入门
    Zookeeper入门
    分布式事务
    Mysql索引会失效的几种情况
    java代码执行过慢的问题定位
    持续集成
    Mycat 数据库分库分表中间件
  • 原文地址:https://www.cnblogs.com/wuweixin/p/4887419.html
Copyright © 2011-2022 走看看