- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何确保仅在从数据库加载字段中的数据时才调用自定义字段的* to_python()*方法?
我正在尝试使用“自定义字段”来处理单个模型属性的Base64编码/解码。直到我实例化了模型的新实例并将此属性设置为其纯文本值,一切似乎都正常工作了……那时,Django尝试对字段进行解码,但由于它是纯文本而失败。
Custom Field实现的魅力在于,我认为我可以在那里处理100%的编码/解码逻辑,因此我的代码的其他部分都不需要了解它。我究竟做错了什么?
(注意:这仅是说明我的问题的示例,我不需要有关如何或不应该使用Base64编码的建议)
def encode(value):
return base64.b64encode(value)
def decode(value):
return base64.b64decode(value)
class EncodedField(models.CharField):
__metaclass__ = models.SubfieldBase
def __init__(self, max_length, *args, **kwargs):
super(EncodedField, self).__init__(*args, **kwargs)
def get_prep_value(self, value):
return encode(value)
def to_python(self, value):
return decode(value)
class Person(models.Model):
internal_id = EncodedField(max_length=32)
>>> from myapp.models import *
>>> Person(internal_id="foo")
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/django/db/models/base.py", line 330, in __init__
setattr(self, field.attname, val)
File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/subclassing.py", line 98, in __set__
obj.__dict__[self.field.name] = self.field.to_python(value)
File "../myapp/models.py", line 87, in to_python
return decode(value)
File "../myapp/models.py", line 74, in decode
return base64.b64decode(value)
File "/usr/lib/python2.6/base64.py", line 76, in b64decode
raise TypeError(msg)
TypeError: Incorrect padding
>>> from myapp.models import *
>>> obj = Person(internal_id="foo")
>>> obj.internal_id
'foo'
>>> obj.save()
>>> newObj = Person.objects.get(internal_id="foo")
>>> newObj.internal_id
'foo'
>>> newObj.internal_id = "bar"
>>> newObj.internal_id
'bar'
>>> newObj.save()
最佳答案
首次为该字段分配值时,是否仅获得TypeError
?您可以编写一个try/except:
def to_python(self, value):
try:
return decode(value)
except TypeError:
return value
关于Django自定义字段: Only run to_python() on values from DB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510162/
我似乎偶然发现了 Django 自定义模型字段中的一个怪癖。我有以下自定义模型字段: class PriceField(models.DecimalField): __metaclass__
来自documentation for to_python : As a general rule, [to_python] should deal gracefully with any of th
如何确保仅在从数据库加载字段中的数据时才调用自定义字段的* to_python()*方法? 我正在尝试使用“自定义字段”来处理单个模型属性的Base64编码/解码。直到我实例化了模型的新实例并将此属性
我正在开发 Django 1.4,我有以下疑问。在 Django Admin 上解析日期之间时,格式应采用“%Y-%m-%d”格式。我刚刚检查了代码,django 模型 DateField 没有使用设
根据docs , SubfieldBase将在 1.10 中删除并替换为 from_db_value() 令我困惑的是: Note that the new approach does not cal
我正在开发一个允许用户提交表单的网络应用程序。提交表单后,get_db_prep_value() 会加密所有字段。我正在努力解决的问题是解密 django 管理应用程序中的字段的功能。解密过程工作正常
我是 Python 和 Django 的新手,也是 Stack Overflow 的新手,所以我希望我不会在这里违反任何规则,我尊重问题格式。 我在尝试使用 Django(Python 3.3.0、D
我正在尝试实现一个加密的字符字段。 我正在使用 pydes用于加密 这是我的: from pyDes import triple_des, PAD_PKCS5 from binascii import
如何从自定义 Django 模型字段的 to_python 调用访问模型实例?例如,当我覆盖 pre_save 时,我将 model_instance 作为参数之一。to_python 仅接收值。我怎
已更新 我有以下自定义字段类: class Binary(models.Field): __metaclass__ = models.SubfieldBase def get_prep
在the docs ,有一段关于to_python方法,负责反序列化值。但是推荐的序列化数据并准备好传递给小部件的方法是什么?类似于 get_db_prep_value(),但用于字段? 最佳答案 有
这是一个我无法使用文档回答的 boost.python 问题。 我有两个 C++ 类 A 和 B,这样 B 是 A 的子类,在某些条件下,类型 A 的对象可以转换为类型 B 的对象。这两个类都使用 c
我正在尝试使用 Boost.Python 将我的 C++ 类公开给 Python。这是我正在尝试做的事情的简单版本: struct Base { virtual ~Base() {};
前段时间,作为学习Python+Django过程的一部分,我决定为BIT列类型编写一个自定义的MySQL特定的模型字段。不幸的是,我遇到了一个问题。 项目:包含一个“主”应用 “主”应用程序:包含由“
从 Django 1.9 升级到 1.10 后,我发现 django-geolocation 包提供的字段的行为发生了变化。 这是为破坏行为的 1.10 兼容性所做的更改:https://github
我是 boost.python 的新手,我遇到了这个错误,我想得到一些帮助。作为一个更大项目的一部分,我正在为我拥有的 vector 类编写一个包装器。正如您从下面的代码中注意到的那样,此类可以是 2
我正在尝试使用 Boost.Python 将我的 C++ 类公开给 Python。这是我正在尝试做的简单版本: 我有一个从 boost::noncopyable 派生的类 A 和第二个类 B,其方法将
我正在将应用程序从 python 2/Django 1.4 迁移到 python 3/Django 2.1.5。我对自定义 JSON 字段有一个奇怪的行为: class JSONField(model
我是一名优秀的程序员,十分优秀!