You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中创建房东账户审批管理页面

Django房东账户审批管理页面实现方案

核心思路

不用给User模型注册两个Admin类,而是通过以下方式实现需求:

  1. 自定义ModelAdmin筛选未激活的房东账户
  2. 用**内联模型(Inline)**在用户详情页关联展示房产信息
  3. 添加自定义操作实现审批/拒绝功能

完整代码实现

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import User, Property, UserType, PropertyStatus

# 定义房产信息的内联展示类
class PropertyInline(admin.TabularInline):
    model = Property
    extra = 0
    # 根据你的Property模型补充需要展示的只读字段
    readonly_fields = ['name', 'status', 'address', 'area']
    can_delete = False  # 审批页禁止删除房产

# 自定义待审批房东的Admin类
class PendingLandlordAdmin(BaseUserAdmin):
    # 列表页展示字段
    list_display = ['username', 'email', 'phone_number', 'get_property_name', 'get_property_status']
    # 列表页筛选器
    list_filter = ['user_type', 'is_active']
    # 详情页分块布局
    fieldsets = (
        ('用户基础信息', {'fields': ('username', 'email', 'phone_number')}),
        ('账户状态', {'fields': ('is_active', 'user_type')}),
        # 补充其他需要展示的用户字段块
    )
    # 关联房产内联组件
    inlines = [PropertyInline]
    # 管理员不可修改的字段
    readonly_fields = ['username', 'email', 'phone_number', 'user_type']

    # 筛选未激活的房东用户
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(user_type=UserType.LANDLORD, is_active=False)

    # 列表页显示关联房产名称
    def get_property_name(self, obj):
        prop = obj.properties.first()
        return prop.name if prop else '无房产信息'
    get_property_name.short_description = '房产名称'

    # 列表页显示房产状态(显示友好名称)
    def get_property_status(self, obj):
        prop = obj.properties.first()
        return prop.get_status_display() if prop else '无'
    get_property_status.short_description = '房产状态'

    # 批量操作:审批/拒绝
    actions = ['approve_selected', 'reject_selected']

    def approve_selected(self, request, queryset):
        # 激活用户+更新房产状态为已通过
        for user in queryset:
            user.is_active = True
            user.save()
            user.properties.update(status=PropertyStatus.APPROVED)
        self.message_user(request, f"已成功审批{queryset.count()}个房东账户")
    approve_selected.short_description = '审批选中的房东账户'

    def reject_selected(self, request, queryset):
        # 更新房产状态为拒绝,用户保持未激活(可根据需求改为删除用户)
        for user in queryset:
            user.properties.update(status=PropertyStatus.REJECTED)
        self.message_user(request, f"已拒绝{queryset.count()}个房东账户的申请")
    reject_selected.short_description = '拒绝选中的房东账户'

# 替换默认的UserAdmin
admin.site.unregister(User)
admin.site.register(User, PendingLandlordAdmin)

# 【可选】如果需要保留普通用户管理页面,注册代理模型
# class RegularUser(User):
#     class Meta:
#         proxy = True
#         verbose_name = '普通用户'
#         verbose_name_plural = '普通用户'
# 
# class RegularUserAdmin(BaseUserAdmin):
#     pass
# admin.site.register(RegularUser, RegularUserAdmin)

关键功能说明

  1. 内联展示多模型数据:通过PropertyInline将关联的房产信息直接嵌入用户详情页,实现单页查看用户+房产数据。
  2. 精准筛选待审批用户:重写get_queryset方法,只返回未激活的房东账户,避免无关数据干扰。
  3. 审批/拒绝操作:
    • 支持批量选中用户一键操作,同时更新用户激活状态和对应房产的审核状态。
    • 若需单个用户快速操作,可通过重写change_view方法在详情页顶部添加单独的审批/拒绝按钮。
  4. 字段权限控制:通过readonly_fields限制管理员只能操作账户状态,无法修改用户的基础注册信息。

可选优化

  • 添加审批日志:记录操作管理员、操作时间和操作内容,便于溯源。
  • 状态颜色标记:自定义Admin CSS为不同房产状态添加颜色标识,提升页面可读性。
  • 邮件通知:审批/拒绝后自动发送邮件通知房东。

内容的提问来源于stack exchange,提问作者Hiệp Trần Hoàng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:04:52