如何在django admin 的user中添加额外属性,扩容用户信息

djangouser很实用,但是默认只有用户名、邮箱、名字、姓氏、职员状态等属性。

default info


那么怎么扩展用户信息呢?

目前用django开发的系统已经运行了一段时间,现在想给每个用户添加电话号码,头像等字段。

为了不影响现有用户账号数据,使用One-To-One Link的方法

1、新建APP accounts,另外一张表用来存你想要的用户信息,比如电话号码、照片等

python manage.py startapp accounts
create accounts

settings.py添加 ‘accounts.apps.AccountsConfig’,

INSTALLED_APPS = [
 
    'accounts.apps.AccountsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

]


2、在accountsmodel中添加附加个人信息

我这里添加了5个属性,网站、电话号码、工作类型、个人介绍、照片。

templates里面添加了constant_files.py,用于存工作类型JOB_TYPES

templates/constant_files.py

JOB_TYPES =(
         ('工作1', '工作1'),
         ('工作2', '工作2'),
         ('工作3', '工作3'),
         ('其他', '其他'),
     )

accounts/models.py

from django.db import models
from django.contrib.auth.models import User
from templates.constant_files import JOB_TYPES


class UserProfileInfo(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    portfolio_site = models.URLField("网站",blank=True)
    portfolio_phone = models.BigIntegerField("电话号码")
    portfolio_job_type =  models.CharField("工作类型",choices=JOB_TYPES, max_length=50)
    portfolio_descption = models.TextField("个人介绍")
    profile_pic = models.ImageField("照片",upload_to='profile_pics',blank=True)


    def __str__(self):     
        return self.user.username

照片存在static/profile_pics,还需要新建文件夹profile_pics


3、安装pillow

pillow是用于图片的插件,

没有安装pillow提示:

django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
accounts.UserProfileInfo.profile_pic: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".

System check identified 1 issue (0 silenced).

pip install pillow

(myvenv) [email protected]:~/django/HRSystemByDjango$ pip install pillow
Collecting pillow
  Downloading https://files.pythonhosted.org/packages/10/5c/0e94e689de2476c4c5e644a3bd223a1c1b9e2bdb7c510191750be74fa786/Pillow-6.2.1-cp36-cp36m-manylinux1_x86_64.whl (2.1MB)
    100% |████████████████████████████████| 2.1MB 86kB/s
Installing collected packages: pillow
Successfully installed pillow-6.2.1

4、修改admin

accounts/admin.py

from django.contrib import admin
from .models import UserProfileInfo, User


# Register your models here.
admin.site.register(UserProfileInfo)

5、重建数据库

python manage.py makemigrations
python manage.py migrate

6.查看admin



7、但是这样user在两个类别下,看起来非常难受。

能不能把个人附加信息放到user里面?

修改accounts/admin.py

from django.contrib import admin

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

from .models import UserProfileInfo, User


# Register your models here.
#admin.site.register(UserProfileInfo)

class ProfileInline(admin.StackedInline):
    model = UserProfileInfo
    can_delete = False
    verbose_name_plural = '附加信息'
    fk_name = 'user'

class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline, )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)


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

再次查看用户信息



大功告成,现在用户信息里面有附加的信息了。

还有其他几种自定义用户信息的方法,详细可以查看链接

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

django如何注册用户


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



1 条评论

django 如何利用forms更新用户信息 - Christopher · 2019年12月30日 下午8:58

[…] 怎么扩展用户信息 […]

发表评论

电子邮件地址不会被公开。 必填项已用*标注