使用Django import_export导入用户时密码未加密的解决咨询
解决Django ImportExport导入用户密码未加密问题
要解决导入用户数据时密码未加密的问题,你需要自定义ImportExport的资源类,在保存用户实例前对密码字段进行哈希处理。具体实现如下:
步骤说明
- 新增必要模块导入:引入
import_export.resources用于自定义资源类,以及django.contrib.auth.hashers.make_password用于密码加密 - 为
CustomUser编写自定义资源类,重写before_save_instance方法,在实例保存前完成密码加密 - 在你的
ImportExportModelAdmin子类中指定这个自定义资源类
修改后的完整admin.py代码
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from import_export.admin import ImportExportModelAdmin from import_export import resources # 新增导入 from django.contrib.auth.hashers import make_password # 新增导入 from student.models import Students, CustomUser # 自定义资源类,处理密码加密逻辑 class CustomUserResource(resources.ModelResource): class Meta: model = CustomUser fields = ('id', 'username', 'password', 'email') # 按需添加其他需要导入导出的字段 def before_save_instance(self, instance, using_transactions, dry_run): # 仅对明文密码加密(避免重复加密已哈希的密码) if not instance.password.startswith(('pbkdf2_sha256$', 'bcrypt$', 'argon2$')): instance.password = make_password(instance.password) return super().before_save_instance(instance, using_transactions, dry_run) class UserModel(UserAdmin): pass class UserModel2(ImportExportModelAdmin): resource_class = CustomUserResource # 指定自定义资源类 admin.site.register(CustomUser, UserModel2)
关键细节
before_save_instance方法会在用户实例写入数据库前触发,这里通过判断密码开头的哈希标识,避免重复加密已处理过的密码make_password会自动使用Django配置的默认哈希算法对明文密码加密,无需手动指定算法- 可根据实际需求调整
fields列表,确保包含所有需要导入导出的用户字段
内容的提问来源于stack exchange,提问作者Cogp39
相关产品推荐
相关产品推荐

