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

使用Django import_export导入用户时密码未加密的解决咨询

解决Django ImportExport导入用户密码未加密问题

要解决导入用户数据时密码未加密的问题,你需要自定义ImportExport的资源类,在保存用户实例前对密码字段进行哈希处理。具体实现如下:

步骤说明

  1. 新增必要模块导入:引入import_export.resources用于自定义资源类,以及django.contrib.auth.hashers.make_password用于密码加密
  2. 为CustomUser编写自定义资源类,重写before_save_instance方法,在实例保存前完成密码加密
  3. 在你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:10:37