django之对django内置的User模型进行自定义扩展方式

yizhihongxing

django内置的User模型进行自定义扩展可以使用Django提供的User模型扩展机制。下面详细讲解对django内置的User模型进行自定义扩展方式的完整攻略。

一、创建扩展模型

第一步是创建扩展模型,继承自Django内置的User模型,并添加想要扩展的字段。这里我们以添加nickname为例。创建一个新的app,这里我们取名为account:

# account/models.py

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

class User(AbstractUser):
    nickname = models.CharField(max_length=50, blank=True)

上面的代码中,User继承自Django内置的AbstractUser模型,添加了一个CharField类型的nickname字段。blank=True表示该字段可以为空。

二、修改settings.py

第二步是修改settings.py文件来使用我们定义的User模型。

# settings.py

AUTH_USER_MODEL = 'account.User'

三、进行数据库迁移

第三步是进行数据库迁移。进入项目根目录,运行以下命令:

python manage.py makemigrations
python manage.py migrate

四、使用扩展模型

现在我们可以使用扩展后的User模型了。例如,我们可以在视图里使用以下代码获取当前用户的nickname:

# views.py

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required
def home(request):
    nickname = request.user.nickname
    return render(request, 'home.html', {'nickname': nickname})

五、添加扩展字段到django admin

如果想在后台管理界面(django admin)中看到扩展的字段,需要进行如下配置:

# admin.py

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

class CustomUserAdmin(UserAdmin):
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'nickname')
    fieldsets = UserAdmin.fieldsets + ((None, {'fields': ('nickname',)}),)

admin.site.register(User, CustomUserAdmin)

在上面的代码中,我们继承自Django内置的UserAdmin,然后添加了nickname字段到显示列表(list_display)和输入表单(fieldsets)中。最后,我们通过admin.site.register()将扩展的User模型注册到后台管理界面。

六、使用信号扩展User模型

除了继承AbstractUser创建扩展模型外,还可以使用信号扩展User模型。下面我们以添加一个is_vip字段为例来演示。

# account/signals.py

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    is_vip = models.BooleanField(default=False)

@receiver(post_save, sender=User)
def create_or_update_userprofile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
    instance.profile.save()

UserProfile是一个扩展了User模型的模型。我们使用了Django提供的post_save信号和一个接收器(receiver)create_or_update_userprofile来自动创建或更新用户的UserProfile。在接收器中,我们首先判断是否是创建用户,如果是,则创建一个UserProfile,否则更新已有的UserProfile。最后,我们通过instance.profile.save()来保存UserProfile。要使用UserProfile,需要在User模型中添加一个OneToOneField,来关联UserProfile。

# account/models.py

from django.contrib.auth.models import AbstractUser
from django.db import models
from .signals import create_or_update_userprofile

class User(AbstractUser):
    nickname = models.CharField(max_length=50, blank=True)
    profile = models.OneToOneField('UserProfile', on_delete=models.CASCADE, null=True)

# signals.py中的接收器需要在models.py中引入才能生效
models.signals.post_save.connect(create_or_update_userprofile, sender=User)

最后,我们需要在models.py中,导入signals.py中的接收器,并将接收器连接到User模型的post_save信号上。

这就是使用信号扩展User模型的完整攻略。

以上两条示例提供了两种扩展User模型的方法,你可以选择其中一种来实现自定义扩展。无论你选择哪一种,都需要在项目中使用扩展的User模型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django之对django内置的User模型进行自定义扩展方式 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • django之froms组件

    一:froms组件的作用   在我们进行web端的开发的时候,常常用到对表单的数据的获取并发送给后台,无论是对通过from表单提交还是通过ajax提交。我们都免不了对表单输入框的数据进行获取,在后端对数据进行验证并把验证结果再返回前端页面。常常有些验证逻辑很繁琐,一个不小心可能会出错,大费心力。而djingo自带的from组件,可以对表单自动生成,表单数据验…

    Django 2023年4月12日
    00
  • Django的查询表记录

    查询API   (1) all() :查询所有结果         调用者:objects管理器 返回queryset ret=Book.objects.all() print(ret) # <QuerySet [<Book: GO>, <Book: linux>, <Book: 北京折叠>, <Book: 三…

    Django 2023年4月10日
    00
  • Django日志配置

    Django使用Python内建的logging模块打印日志,配置由四个部分组成 记录器:Logger 处理程序:Handler 过滤器:Filter 格式化:formatter   记录器-Logger Logger为日志系统的入口,每个logger命名都是bucket,可以向bucket写入需要处理的消息 Python定义以及几种日志级别: DEBUG:…

    2023年4月10日
    00
  • Django – 权限(5)- 非菜单权限对应的一级菜单展开、面包屑导航

    一、非菜单权限对应的一级菜单展开   需求:客户列表和账单列表页面中都有添加按钮,当点击添加客户(或编辑客户、删除客户)时,客户列表所属的一级菜单展开,当点击添加账单(或编辑账单、删除账单)时,账单列表所属的一级菜单展开。 1、permission表新增一个pid字段,表示非菜单权限的父级菜单权限id,permission模型类如下: class Permi…

    Django 2023年4月10日
    00
  • Django之ORM字段和参数

    字段 常用字段 AutoField                                                                                                                                                                   …

    Django 2023年4月9日
    00
  • Django之auth模块

    auth模块是Django内置的用户权限管理模块:比如用户的创建,认证,登入,注销等。当我们创建一个APP时,auth模块就会自动添加在 INSTALLED_APPS=[‘django.contrib.auth’,] auth常用的几个方法:   User模型(auth/models.py中):用来维护用户信息的模型;比如用户的创建,认证等; 源码中User…

    Django 2023年4月9日
    00
  • Django项目部署流程与Nginx安装配置

    安装Nginx 在Ubuntu系统中,可以通过以下命令安装Nginx: sudo apt-get update sudo apt-get install nginx 配置静态文件访问 在Django项目的settings.py文件中,加入以下代码: STATIC_URL = '/static/' STATIC_ROOT = os.path…

    Django 2023年3月13日
    00
  • django 实现简单的插入视频

    下面是详细讲解“django 实现简单的插入视频”的完整攻略: 1. 安装必要的库 在 Django 中插入视频,需要安装 Django 的文件上传插件 django-cleanup 和 视频相关库 ffmpeg。 使用命令 pip install django-cleanup ffmpeg 来进行安装。 2. 定义视频上传模型 在 models.py 中定…

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部