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注册功能模块实现方法

    下面我将为你介绍如何实现通用的Django注册功能模块。总的来说,这个功能模块包含以下几个步骤: 创建一个注册页面,允许用户输入用户名、邮箱和密码。 将用户输入的信息添加到数据库中。 发送激活邮件给用户,要求用户点击链接进行账户激活。 下面是实现步骤的具体细节。 1. 创建注册页面 在Django中,可以使用内置的表单(Form)功能来创建注册页面。首先,创…

    Django 2023年5月16日
    00
  • django中path和url函数的具体使用

    在Django中,path和url函数用于先匹配URL并执行相应视图函数。 path函数的使用 语法结构 path(route, view, kwargs=None, name=None) 参数说明 route:字符串类型,表示 URL 规则 view:处理请求的函数(视图函数), 每个视图都有一个函数视图对应 kwargs:字典类型,传递额外的参数给视图函…

    Django 2023年5月16日
    00
  • Django项目发布 环境部署(中)

    python环境部署 我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和python3并存。 1、  安装Python3的依赖包 2、  命令…

    2023年4月10日
    00
  • python3.8+django2+celery5.2.7环境准备(python测试开发django)

    下面是关于“python3.8+django2+celery5.2.7环境准备”的完整攻略。 一、环境准备 下载Python3.8 在Python官网上下载Python3.8的安装包并安装,或者通过apt、yum等包管理工具进行安装。 安装并配置virtualenv virtualenv是一个可以创建虚拟Python环境的工具,并且可以在不同的项目中使用不同…

    Django 2023年5月16日
    00
  • django 简单会议室预约(1)

    django 是python的一个web框架,为什么要用django,作者之前用过另一个框架flask,虽然flask比较简单很容易让人学,但是flask没有整体感,会让初学着茫然。 这里我们用django。现在最新版本是django-1.9.2。从1.7开始就有点区别了,后面会讲到。 首先搭建环境: Ubuntu 14.04 Python 2.7.6 Dj…

    Django 2023年4月11日
    00
  • Django-基本命令

    打开 Linux 或 MacOS 的 Terminal (终端)直接在 终端中输入这些命令(不是 python 的 shell中) 如果是 windows 用 cmd(开始 搜索 cmd 或者 快捷键 win + R,输入 cmd) 直接在 cmd 上操作。 1. 新建一个 django project django-admin.py startprojec…

    Django 2023年4月10日
    00
  • django与easyui使用过程中遇到的问题

    最近要使用django前台用easyui,发现当从后台获取数据过程中会出现跨域问题。 多次尝试后发现将ajax的方法设置为GET就没问题了 代码如下: $(‘#syslog_1′).datagrid({ url:’/bookapp/book/test/’, toolbar:’#toolbar’, fitColumns:true, iconCls:’icon-…

    Django 2023年4月13日
    00
  • django 从零开始 9 自定义密码验证加密

    先上想法,想对数据库账号的密码进行一个加密,但是django文档中的加密方法set_password貌似是只针对他们默认的user模型 或者继承 AbstractBaseUser的模型有效 from django.contrib.auth.models import AbstractBaseUser from django.contrib.auth.mode…

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