使用save_model()进行Django管理的奇怪行为-问答-阿里云开发者社区-阿里云

开发者社区> kun坤> 正文

使用save_model()进行Django管理的奇怪行为

2019-12-25 15:50:06 260 1

我目前有一个自定义用户模型,其中一些字段应该是加密的(数据端),但在Django管理,他们需要解密显示实际的数据,所以我有encrypt_string()和decrypt_string()函数来处理它。 我的用户模型:

class User(AbstractUser):
    uid = models.CharField(
      "uid", max_length=255, null=True, blank=True)
    nickname = models.CharField(
        "Nickname", max_length=255, null=True, blank=True)

    eth_address = models.CharField(
        "Eth address", max_length=255, null=True, blank=True)
    eth_private_key = models.CharField(
        "Eth private key", max_length=255, null=True, blank=True)
    evt_address = models.CharField(
        "Evt address", max_length=255, null=True, blank=True)
    evt_private_key = models.CharField(
        "Evt private key", max_length=255, null=True, blank=True)

eth_address、eth_private_key、evt_address和evt_private_key需要在进行任何类型的保存或编辑时进行加密 当前,当我的服务器请求从一个api,它将创建一个默认用户(处理自定义验证类的django-rest-framework): existed_user_check = User.objects.filter (uid = uid) .exists ()

    if not existed_user_check:
        random_password = ''.join(["{}".format(randint(0, 9)) for num in range(0, 6)])
        eth_address, eth_private_key = generate_eth()
        evt_address, evt_private_key = generate_evt()
        new_user = User(
            username=uid, 
            uid=uid, 
            eth_address=encrypt_string(eth_address), 
            eth_private_key=encrypt_string(eth_private_key), 
            evt_address=encrypt_string(evt_address), 
            evt_private_key=encrypt_string(evt_private_key)
        )
        new_user.set_password(random_password)
        new_user.save()

在我的Django管理中,我在Admin .py中编写了以下内容来处理解密(在change视图中显示数据时)和加密(在保存或编辑这4个字段时):

user_profile_encrypt_fields = [
    'eth_address',
    'eth_private_key',
    'evt_address',
    'evt_private_key'
]
class UserAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserAdminForm, self).__init__(*args, **kwargs)
        for field in user_profile_encrypt_fields:
            if getattr(self.instance, field) is not None:
                try:
                    self.initial[field] = decrypt_string(getattr(self.instance, field))
                except Exception as e:
                    pass


class UserAdminCustom(admin.ModelAdmin):
    # UserAdminForm handle decrypt data
    form = UserAdminForm
    exclude = ('password', 'last_login', 'is_superuser', 'is_staff', 'groups',
               'user_permissions', 'username', 'first_name', 'last_name', 'is_active', 'date_joined')

    def get_queryset(self, request):
        qs = super(UserAdminCustom, self).get_queryset(request)
        return qs.filter(is_staff=False)

    def get_readonly_fields(self, request, obj=None):
        return ('id', 'created', 'modified')

    # save_model() handle encrypt data on saving
    def save_model(self, request, obj, form, change):
        for field in form.changed_data:
            if form.cleaned_data.get(field) is not None:
                if field in user_profile_encrypt_fields:
                    encrypted_value = encrypt_string(form.cleaned_data.get(field))
                    setattr(obj, field, encrypted_value)
        obj.save()


admin.site.register(User, UserAdminCustom)

自定义us根除minform为我解密数据,以便管理员可以看到它是什么,当他们做编辑或检查。 解密后的数据能够正确地显示在change视图中 save_model()将在Django admin change视图上编辑字段时处理数据加密。 我目前的问题: 注: 这些字段中的数据是存在的,所以我只讨论django admin上的编辑对象部分。 当我试图编辑任何字段并保存它(应该加密)时,该字段被加密并保存了,但它下面的字段(它的实际加密数据)现在变成了它的实际数据(未加密) 在更改视图和保存上编辑evt_address之后 使用form = us根除minform时解密的数据

在us根除mincustom上注释掉# form = us根除minform,这样它就会显示实际的数据

我打印出了getattr(self。在加载django admin change视图时查看加密数据,得到以下4个加密字段:

web_1         | eth_address : gAAAAABeAcoI08bH2fQqJboZFxg6xn5RCxdRopllS6fDeyRmsC3qzsTXo88NVYOb58eeX5IXQpxqcGhbLr8wRRoWSKQsX5vLbPPhmWqUiqf0XYQvdWUhhgYxxMwwqgEOwU2OtJfkZ0p6
web_1         | eth_private_key : gAAAAABeAcoIp1V9sKNnL-dO-fWH1W1oM7hbqky44aRLchmTtvckaaZdaKuXo1xIIozx3xl40Y2Ct3YAyCOfkJJranKgTNDcVhndYdu5-awOuYpPCJKkSSia7IP_gWjLE91Gh8vsGnkn1iEkrLaho2ff0vVHS1QgGaJxji5m7cwCk0tqSp2AIeA=
web_1         | evt_address : gAAAAABeAcoIM3rywSgAPL611WUoWLJ9mqIgUHhZn8KDQd9hi9xHzgRri0EkoS_yBvwQyzdH72RWJRsDCs38oF9P8HHW_wFDWQ==
web_1         | evt_private_key : 1814067

因此,在编辑evt_address值并保存之后,我的evt_private_key数据被更改为1814067 为什么会这样,我很困惑到底是什么造成的。 希望有人能帮助我 问题来源StackOverflow 地址:/questions/59466161/django-admin-weird-behavior-with-save-model

取消 提交回答
全部回答(1)
相关问答

3

回答

@aliyun.com邮箱客户端密码登录方式 下线通知

仙游 2015-01-16 14:33:54 125904浏览量 回答数 3

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157131浏览量 回答数 145

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 292358浏览量 回答数 110

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146817浏览量 回答数 22

5

回答

公司给开的企业邮箱帐户,为什么用foxmail会提示密码错误?

萝卜兔兔 2015-07-13 10:27:30 143697浏览量 回答数 5

33

回答

Win Server 2003-2016 加密勒索事件必打补丁合集

妙正灰 2017-05-15 10:44:38 277593浏览量 回答数 33

42

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 135617浏览量 回答数 42

1

回答

foxmail 关联企业邮箱提示邮箱地址或者密码错误

2017-12-30 21:50:39 150714浏览量 回答数 1

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302648浏览量 回答数 249

24

回答

【精品问答】python技术1000问(1)

问问小秘 2019-11-15 13:25:00 471605浏览量 回答数 24
+关注
0
文章
13401
问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载