【发布时间】:2016-02-04 05:37:10
【问题描述】:
是否可以构建一个自定义模型字段/小部件组合,它显示一个值但从不将任何内容写回数据库?我会专门在管理员表单中使用这个小部件。
我编写了自己的字段,它覆盖了formfield() 方法来声明自己的小部件类。它显示得很好,但是一旦在管理员中单击“保存”按钮,我就会收到验证错误:
This field is required.
考虑到我的小部件没有呈现表单字段,这是有道理的。但是,我想做的基本上是从更新过程中删除此字段:无论何时在管理员中使用,它都不应该在 SQL UPDATE 中提及。
这可能吗?
这是我目前的代码草图:
class MyWidget(Widget):
def render(self, name, value, attrs=None):
if value is None:
value = ""
else:
# pretty print the contents of value here
return '<table>' + ''.join(rows) + '</table>'
class MyField(JSONField):
def __init__(self, *args, **kwargs):
kwargs['null'] = False
kwargs['default'] = list
super(MyField, self).__init__(*args, **kwargs)
def formfield(self, **kwargs):
defaults = {
'form_class': JSONFormField,
'widget': MyWidget,
}
defaults.update(**kwargs)
return super(MyField, self).formfield(**defaults)
更新 1:用例是该字段表示审计日志。在内部,它将定期写入。然而,管理员永远不需要写它,它只需要以非常易读的格式呈现出来。
我没有在应用程序中使用任何其他 ModelForm,因此管理员是唯一的表单用户。我不想在管理类本身上实现该行为,因为该字段将在各种模型中重复使用,并且应该始终以相同的方式运行。
【问题讨论】:
-
作为一个临时解决方案,我在我的小部件渲染器中添加了一个隐藏字段,但这感觉不对:现在我正在通过浏览器发送序列化的字段内容,然后对其进行反序列化返回,而不是仅仅从保存操作中删除这一字段。
标签: python django django-admin