开发者社区> 问答> 正文

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

我目前有一个自定义用户模型,其中一些字段应该是加密的(数据端),但在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

展开
收起
kun坤 2019-12-25 15:50:06 701 0
1 条回答
写回答
取消 提交回答
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载