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

Django使用Import-export模块导入User模型报NotRegistered错误如何解决

Django原生User模型批量导入报错解决方案

报错根因分析

你遇到的django.contrib.admin.sites.NotRegistered: The model User is not registered报错,以及代码隐含的其他问题共有以下几处:

  • 调用admin.site.unregister(User)时,原生User模型还未被注册到当前admin站点,通常是admin模块加载顺序导致的,没有提前加载Django默认的User admin注册逻辑
  • UserResource下的Meta类缩进错误,不属于UserResource的内部类,资源配置完全失效
  • 字段配置的email后缺失逗号,会被Python识别为字符串拼接,字段配置逻辑错误
  • 错误引入了password1、password2字段:这两个是Django用户注册表单的校验字段,原生User模型仅存在存储加密后密码的password字段,不存在这两个字段

修正后的完整代码

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
from import_export.admin import ImportExportModelAdmin
from import_export import resources

class UserResource(resources.ModelResource):
    class Meta:
        model = User
        # 移除不存在的password1、password2字段,保留实际模型存在的字段
        fields = ('id','username','first_name', 'last_name', 'email', 'password')

    # 如果你导入的用户表中password是明文,添加该方法自动加密后存储;如果导入的已经是Django加密格式的密码可删除这段
    def before_save_instance(self, instance, using_transactions, dry_run):
        # 仅当密码不是Django加密格式(加密格式开头为pbkdf2_sha256$)时做加密处理
        if not instance.password.startswith('pbkdf2_sha256$'):
            instance.password = make_password(instance.password)
        return instance

class UserAdmin(ImportExportModelAdmin):
    list_display = ('id','username','first_name', 'last_name', 'email')
    resource_class = UserResource

# 先判断User是否已注册,避免未注册就调用unregister报错
if admin.site.is_registered(User):
    admin.site.unregister(User)
admin.site.register(User, UserAdmin)

额外注意事项

  • 导入的用户表格中如果是明文密码,上述代码会自动加密存储,不需要额外处理
  • 如果不需要导入密码字段,可以直接删除fields中的password项,导入后用户默认不可登录,可后续手动重置密码

内容的提问来源于stack exchange,提问作者RlM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:03