Django2.0自定义用户模型

使用场景:用户模型新增字段(如增加昵称),两种方法
创建自定义模型,关联USER #使用这种方法
继承Django用户模型(在项目进行中不建议使用,会删除项目数据)

1,创建模型models.py

from django.db import models
from django.contrib.auth.models import User


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nickname = models.CharField(max_length=20, verbose_name='昵称')   #verbose_name把后台显示改成中文

    def __str__(self):
        return '<Profile: %s for %s>' % (self.nickname, self.user.username)

在后台管理页面显示模型admin.py

from .models import Profile
from django.contrib import admin

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'nickname')
zhonghao@zhonghao:~/Yzh_site$ python manage.py makemigrations     #生成数据库迁移文件
zhonghao@zhonghao:~/Yzh_site$ python manage.py migrate      #同步数据库

2,在后台用户模型里显示定义的nickname相关信息
用户模型在这里插入图片描述在之前admin.py基础上

from .models import Profile
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False

class UserAdmin(BaseUserAdmin):
    inlines = (ProfileInline, )
    list_display = ('username', 'nickname', 'email', 'is_staff', 'is_active', 'is_superuser')

    def nickname(self, obj):       #自定义一个nickname显示
        return obj.profile.nickname
    nickname.short_description = '昵称'  #后台用户模型nickname字段显示中文

admin.site.unregister(User)
admin.site.register(User, UserAdmin)


@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'nickname')

Django官网文档列子
扩展现有的用户(User)模型¶

有两种方法可以扩展默认的User模型,而不需要用你的模型来替换它。如果你需要改变的只是行为,并且不需要改变数据库存储的内容,那么你可以建立一个基于User模型的代理模型。它允许代理模型提供很多功能,包括默认排序,自定义的管理器和自定义的模型方法等。

如果你想存储与User模型关联的信息,可以使用OneToOneField到包含其他信息字段的模型。这种one-to-one模型经常被称作Profile模型,因为它可能存储站点用户的非身份验证的相关信息。比如你可以建立一个Employee模型:

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.CharField(max_length=100)


假设一个既有用户又有雇员模型的现有雇员Fred Smith,您可以使用Django的标准相关模型约定访问相关信息:

>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.employee.department

添加资料(Profile)模型到管理后台的用户页面,需要定义一个 InlineModelAdmin (这个例子中,我们使用 StackedInline ) 到你的app里的admin.py中,并把它添加到 UserAdmin后,向 User 类注册:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

from my_user_profile_app.models import Employee

# Define an inline admin descriptor for Employee model
# which acts a bit like a singleton
class EmployeeInline(admin.StackedInline):
    model = Employee
    can_delete = False
    verbose_name_plural = 'employee'

# Define a new User admin
class UserAdmin(BaseUserAdmin):
    inlines = (EmployeeInline,)

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

这些资料模型并不特殊,它们只是Django模型,用来一对一链接用户模型。因此,它们并不会在一个用户创立的时候自动生成,但可以使用 django.db.models.signals.post_save 来适当地创建或者更新相关模型。

使用相关模型会产生额外的查询或连接来检索相关数据。根据你的需求,一个自定义的用户模型包含相关联的字段可能是更好的选择,然而,与项目应用里的默认用户模型存在关联性可能会增加额外的数据库负载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个使用Python编写的Web应用程序框架,它提供了许多强大的工具和功能来帮助开发人员快速构建高效的Web应用程序。 要玩转Django 2.0代码,首先需要安装Django 2.0,并且熟悉其基本的目录结构和文件组织方式。在创建一个新的Django项目时,可以使用命令行工具来生成基本的项目结构,然后在其中创建应用程序并定义模型、视图和模板。 在使用Django 2.0开发Web应用程序时,需要熟悉Django的MTV(模型-模板-视图)架构,这是Django应用程序的核心概念。模型用于定义数据结构和处理数据库操作,视图负责处理用户请求并返回响应,模板则用于生成最终的用户界面。 此外,了解如何使用Django 2.0的路由系统来处理URL映射和视图函数的调度也非常重要。可以使用Django的路由配置来定义URL模式,并将它们映射到相应的视图函数上。 另外,了解Django 2.0的表单处理、认证和权限管理功能也是必不可少的。Django提供了丰富的表单组件和验证工具,可以帮助开发人员快速构建复杂的表单。而用户认证和权限管理方面,Django提供了强大的认证和授权系统,可以帮助开发人员轻松实现用户注册、登录和权限控制。 总之,要玩转Django 2.0代码,需要深入了解Django的核心概念和功能,并且通过实际的项目实践来提升自己的编码技巧和经验。希望以上回答能帮助你更好的学习和应用Django 2.0

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值