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
相关产品推荐
相关产品推荐

