通过 Django 原有用户模型扩展自定义模型,结合 Django 原有的用户认证、会话维护等功能实现前端独立的登录系统案例
一、需求场景
- 目标:前端页面使用扩展的自定义用户模型(如添加手机号、头像等字段),但 保持 Django Admin 后台的默认用户管理功能不变
- 适用情况:
- 仅需扩展用户字段,无需修改 Admin 后台的默认行为
- 希望 Admin 继续管理基础用户信息,避免复杂配置
二、解决方案:使用代理模型扩展用户
通过 代理模型(Proxy Model) 添加额外字段,不修改原用户表结构,保持 Admin 后台原样。
默认User模型代理模型``UserProfile`前端页面使用Admin后台管理
三、具体实现步骤
1. 创建代理模型扩展字段
# users/models.py
from django.contrib.auth.models import User
class UserProfile(User):
# 代理模型(不创建新表)
class Meta:
proxy = True
verbose_name = '用户扩展信息'
verbose_name_plural = verbose_name
# 添加自定义方法(或通过关联模型扩展字段)
@property
def mobile(self):
return self.profile.mobile # 假设有一对一关联的Profile模型
# 关联模型存储扩展字段(避免修改默认User表)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
mobile = models.CharField('手机号', max_length=11, blank=True)
avatar = models.ImageField('头像', upload_to='avatars/', blank=True)
2. 配置前端使用代理模型
# views.py
from django.contrib.auth.decorators import login_required
from .models import UserProfile
@login_required
def user_profile(request):
# 通过代理模型访问用户数据
user = UserProfile.objects.get(id=request.user.id)
mobile = user.mobile # 调用代理模型的方法
return render(request, 'profile.html', {'user': user})
3. 保持 Admin 后台不变
# users/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
# 默认注册User模型(未修改)
admin.site.register(User, UserAdmin)
4. (可选)在 Admin 中管理扩展字段
# users/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
class CustomUserAdmin(UserAdmin):
inlines = [ProfileInline] # 在用户详情页添加扩展字段
# 重新注册User模型并关联内联
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
四、前端集成扩展字段
1. 用户注册时保存扩展字段
# forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import Profile
class SignupForm(UserCreationForm):
mobile = forms.CharField(max_length=11, required=True)
class Meta(UserCreationForm.Meta):
fields = ('username', 'email', 'mobile', 'password1', 'password2')
def save(self, commit=True):
user = super().save(commit)
Profile.objects.create(
user=user,
mobile=self.cleaned_data['mobile']
)
return user
2. 模板中显示扩展信息
<!-- profile.html -->
<div class="profile">
<h2>{{ user.username }}</h2>
<p>邮箱: {{ user.email }}</p>
<p>手机号: {{ user.mobile }}</p>
<img src="{{ user.profile.avatar.url }}" alt="头像">
</div>
五、方案优势
- Admin 后台零改动:继续使用默认用户管理功能
- 灵活扩展:通过代理模型或关联模型自由添加字段
- 数据安全:不修改原用户表结构,避免迁移风险
六、适用场景
- 需快速扩展用户信息,但无权限修改 Admin 后台
- 项目中期需添加用户字段,但希望逐步迁移
- 团队协作中,需避免影响其他成员的 Admin 使用习惯
总结
通过代理模型或关联模型扩展用户字段,可以在不影响 Django 管理后台的前提下,为前端页面添加丰富的用户信息。此方案平衡了灵活性和兼容性,适合需要快速迭代的敏捷开发场景。