如何在 django admin 中添加不直接链接到模型字段的可编辑字段?

问题描述 投票:0回答:1

如何在 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

django django-forms django-admin
1个回答
0
投票

您可以定义自定义模型字段,例如通过子类化

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()
© www.soinside.com 2019 - 2024. All rights reserved.