是否可以构建一个自定义模型字段/窗口小部件组合,该组合显示值但不会将任何内容写回数据库?我只会在管理员的表单中使用这个小部件。创建仅显示(不可编辑)的Django管理员字段
我写了自己的字段,它覆盖了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:用例是外地代表的审计日志。在内部,它会定期写入。然而,管理员永远不需要写入它,它只需要以非常可读的格式呈现出来。
我没有在应用程序中使用任何其他的ModelForms,所以管理员是唯一的窗体用户。我不想在管理类本身上实现这种行为,因为这个字段将在各种模型中重用,并且总是应该以相同的方式运行。
作为一种临时解决方案,我已经为我的窗口小部件渲染器添加了一个隐藏字段,但这只是感觉不对:现在我通过浏览器发送序列化的字段内容,然后将它们反序列化,而不仅仅是从保存操作中删除这一个字段。 –