我目前有一个自定义用户模型,其中一些字段应该是加密的(数据端),但在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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。