Django中动态加密解密文本字段:模型字段与表单映射问题咨询
解决方案
1. 自定义加密字段直接替换原description字段
不需要新增字段,直接把模型里原有的description字段类型换成你写的EncryptedDescription类就行。这么做的原因:
- 对业务逻辑完全透明,代码里还是用
entry.description调用,自动完成加密解密,不用额外维护两套字段 - 避免数据冗余,明文根本不该存在数据库里,直接存加密后的内容更安全
- 原有表单、视图逻辑不用大改,只需要调整字段类型
示例模型代码:
from django.db import models from your_module import EncryptedDescription class Entry(models.Model): entry_date = models.DateField() # 替换原description字段为自定义加密字段 description = EncryptedDescription()
2. 解决模型表单的"non-editable field"错误
这个错误是因为Django自定义字段默认editable=False,导致表单不把它当成可编辑字段。两种解决方法:
方法一:在自定义字段类里设置editable=True
修改你的EncryptedDescription类,显式开启可编辑属性:
class EncryptedDescription(models.Field): def __init__(self, *args, **kwargs): # 强制设置editable为True,让表单能识别该字段 kwargs.setdefault('editable', True) super().__init__(*args, **kwargs) # 保留你已经实现的加密解密方法 def get_prep_value(self, value): if value is None: return None # 这里写你的加密逻辑 return encrypt_function(value) def from_db_value(self, value, expression, connection): if value is None: return None # 这里写你的解密逻辑 return decrypt_function(value) # 必须定义db_type方法,指定数据库存储类型,比如用text def db_type(self, connection): return 'text'
方法二:在模型表单中手动声明字段
如果不想改自定义字段的属性,也可以在表单类里手动添加description字段:
from django import forms from .models import Entry class EntryForm(forms.ModelForm): # 手动添加description字段,用合适的控件,比如文本域 description = forms.CharField(widget=forms.Textarea) class Meta: model = Entry fields = ['entry_date', 'description']
这样表单就能正常渲染description输入框,提交后数据会自动通过自定义字段的get_prep_value加密存入数据库,从数据库取出时又会自动解密成明文展示。
内容的提问来源于stack exchange,提问作者kapow
相关产品推荐
相关产品推荐

