默认的 Django User 模型可以通过多种不同的方式进行扩展。使用一对一链接扩展用户模型可以说是最流行(并且侵入性最小)的方法。此策略也称为用户配置文件。如果您使用 Django Admin,这种特定方法的难点之一是弄清楚如何在用户编辑页面中显示配置文件信息。这就是本教程的主题。
在这里,我简单地逐步解释了如何在 django admin 中添加用户配置文件的示例。
第 1 步:创建项目
在这一步中,我们将使用 django-admin 创建一个新的 django 项目。返回命令行界面并运行以下命令:
django-admin startproject example
第 2 步:创建应用
现在我们将创建一个名为core的应用程序来存储帖子名称列表。我们故意保持基本的东西。使用Control+c停止本地服务器并使用startapp命令创建这个新应用程序。
python manage.py startapp core
第 3 步:更新 setting.py
在这一步中,我们需要在 settings.py 文件中做两件事,一是我们安装的应用程序名称将以下行添加到您的 settings.py 文件中:
接下来需要在settings.py文件中添加如下:
example/settings.py
.... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'core', ]
第 4 步:创建模型
在这一步中,我们将需要存储联系人的数据库模型。打开 core/models.py 文件并添加以下代码:
core/models.py
from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver from django.contrib.auth.models import User class Profile(models.Model): STUDENT = 1 TEACHER = 2 SUPERVISOR = 3 ROLE_CHOICES = ( (STUDENT, 'Student'), (TEACHER, 'Teacher'), (SUPERVISOR, 'Supervisor'), ) user = models.OneToOneField(User, on_delete=models.CASCADE) location = models.CharField(max_length=30, blank=True) birthdate = models.DateField(null=True, blank=True) role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, null=True, blank=True) def __str__(self): return self.user.username @receiver(post_save, sender=User) def create_or_update_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) instance.profile.save()
好的,一切就绪。我们可以为此更改生成一个迁移文件,然后通过迁移将其集成到我们的数据库中。
python manage.py makemigrations python manage.py migrate
我们想要完成的是允许 Django Admin 用户编辑location、birthdate和role字段。
第 5 步:更新 admin.py
这是一个非常简单的技巧。我们将更改 Django 使用的 UserAdmin,将配置文件实例添加为内联,并扩展默认的 UserAdmin。
如果我们想在配置文件模型中定义的列表视图中显示用户位置,如下所示:
最后,我们取消注册旧的用户管理员并注册新的用户管理员,即使用配置文件模型的自定义。
core/admin.py
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from .models import Profile class ProfileInline(admin.StackedInline): model = Profile can_delete = False verbose_name_plural = 'Profile' fk_name = 'user' class CustomUserAdmin(UserAdmin): inlines = (ProfileInline, ) list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'get_location') list_select_related = ('profile', ) def get_location(self, instance): return instance.profile.location get_location.short_description = 'Location' 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)

运行服务器
在此步骤中,我们将运行本地开发服务器来使用我们的应用程序,而无需将其部署到 Web。
python manage.py runserver
接下来,使用 Web 浏览器转到 http://localhost:8000/admin 地址。

我希望它能帮助你……