Django 自定义用户模型不影响Django原用户模型方案

通过 Django 原有用户模型扩展自定义模型,结合 Django 原有的用户认证、会话维护等功能实现前端独立的登录系统案例


一、需求场景
  • 目标:前端页面使用扩展的自定义用户模型(如添加手机号、头像等字段),但 保持 Django Admin 后台的默认用户管理功能不变
  • 适用情况:
    • 仅需扩展用户字段,无需修改 Admin 后台的默认行为
    • 希望 Admin 继续管理基础用户信息,避免复杂配置

二、解决方案:使用代理模型扩展用户

通过 代理模型(Proxy Model) 添加额外字段,不修改原用户表结构,保持 Admin 后台原样。

默认User模型
代理模型UserProfile
前端页面使用
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 管理后台的前提下,为前端页面添加丰富的用户信息。此方案平衡了灵活性和兼容性,适合需要快速迭代的敏捷开发场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yant224

点滴鼓励,汇成前行星光🌟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值