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

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】使用geetest实现滑动验证

    需导入模块social-auth-app-django 和geetest 提前去官网下载gt.js或者引入http://static.geetest.com/static/tools/gt.js 效果图: html: <div class=”container”> <div class=”row”> <div class=”co…

    Django 2023年4月13日
    00
  • 关于celery django django-celery搭配报错问题及解决方法

    G:\python3_django\DFpro\mypro (win)(py3_django) λ python manage.py celery worker –loglevel=infoTraceback (most recent call last):  File “manage.py”, line 10, inexecute_from_comman…

    Django 2023年4月10日
    00
  • Vue与Django数据交互

    首先配置路由信息,理论上都会添加二级路由:所以会有请求转发 1 from django.conf.urls import url,include 2 3 url(r’^api/(?P<version>\w+)/’,include(“api.urls”)), 此时请求会转发给二级路由:api.urls 1 url(r’^course/$’,cour…

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

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

    Django 2023年5月16日
    00
  • 解决Django中多条件查询的问题

    针对您的问题“解决Django中多条件查询的问题”的攻略,我将从以下几个方面进行详细讲解: 多条件查询的问题概述 基于Q对象的多条件查询 基于Filter对象链式调用的多条件查询 示例说明 总结 1. 多条件查询的问题概述 在Django中处理多条件查询时,常见的问题是如何同时满足多个查询条件。比如说,需要查询满足某个条件A和某个条件B的记录,这时需要用到多…

    Django 2023年5月16日
    00
  • Django html标签make_safe

    from django.utils.safestring import mark_safe a = mark_safe(“<a href=’#’>test</a>”)  

    Django 2023年4月9日
    00
  • django-admin引用百度地图

    实现的功能有,某个地点对应的经纬度自动填上,如果有经纬度的话,自动显示对应经纬度的地点,密匙在去百度地图引用搜索 <script type=”text/javascript” src=”http://api.map.baidu.com/api?v=2.0&ak=密匙”></script> <!–根据地址判断是否是添加批…

    Django 2023年4月12日
    00
  • Django 内置权限扩展案例详解

    这里是针对“Django 内置权限扩展案例详解”的完整攻略,包含两个示例说明的详细讲解。 1. 示例一 1.1 案例描述 假设我们要实现一个博客系统,需要实现以下功能: 所有用户都可以浏览博客列表和单篇博客。 未登录用户不能对博客进行任何操作(包括新建、修改、删除和点赞)。 登录用户可以进行以下操作: 创建自己的博客文章。 修改自己创建的博客文章。 删除自己…

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