如何在 django admin 中添加自定义可编辑字段,然后在将其存储到模型中的字段之前对其进行转换?
鉴于此模型:
import json
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
class Foo(models.Model):
_encrypted_data = models.TextField(null=True, blank=True)
@property
def data(self):
encrypted = self._encrypted_data
if not encrypted:
return {}
return json.loads(decrypt(encrypted))
@data.setter
def data(self, value):
if not value:
self._encrypted_data = {}
return
self._encrypted_data = encrypt(
json.dumps(value, cls=DjangoJSONEncoder)
)
字段
Model._encrypted_data
包含加密数据。
属性
Model.data
可以轻松处理代码中的解密数据:自动加密/解密。
我正在寻找一个代表
Model.data
属性的可编辑管理字段。
我开始探索自定义管理表单,但我不确定如何将解密的数据传递到字段,然后将其保存在模型上。
class FooAdminForm(forms.ModelForm):
class Meta:
model = Foo
fields = '__all__'
data = forms.JSONField(label='Data', required=False)
class FooAdmin(admin.ModelAdmin):
form = FooAdminForm
您可以定义自定义模型字段,例如通过子类化
TextField
:
# app_name/fields.py
class EncryptedJsonField(models.TextField):
def to_python(self, value):
value = super().to_python(value)
if not value:
return {}
return json.loads(decrypt(value))
def from_db_value(self, value, expression, connection):
value = super().from_db_value(value, expression, connection)
if not value:
return {}
return json.loads(decrypt(value))
def get_db_prep_value(self, value, connection, prepared=False):
if value:
value = encrypt(json.dumps(value, cls=DjangoJSONEncoder))
return super().get_db_prep_value(value, connection, prepared)
并在模型中将其用作:
class Foo(models.Model):
data = EncryptedJsoNField()