是否可以构建一个自定义的模型字段/小部件组合,该组合显示一个值,但从不将任何内容写回数据库?我只在管理员的表单中使用这个小部件。
我编写了自己的字段,它覆盖formfield()
方法来声明自己的widget类。它显示得很好,但只要在管理中单击“保存”按钮,就会出现验证错误:
This field is required.
考虑到我的小部件没有呈现表单字段,这是有意义的。不过,我想做的基本上是从更新过程中删除这个字段:无论何时在管理员中使用,它都不应该在SQL更新中被提及。
有可能吗?
这是我目前掌握的代码的草图:
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:用例是该字段表示一个审计日志。在内部,它将定期写入。但是管理员不需要对它进行写入,它只需要以非常可读的格式将其呈现出来。
我没有在应用程序中使用任何其他模型表单,因此管理员是唯一的表单用户。我不想在管理类本身上实现这个行为,因为这个字段将在不同的模型中重用,并且总是应该以相同的方式执行。
有多种方法可以在管理页面中创建只读字段。你对数据库存储的要求有点模糊,所以我仔细考虑一下。
必须首先在
admin.py
中注册AdminModel:现在你可以添加不同的行为。例如,可以添加“编辑/添加”页中显示的字段列表:
这可以是模型字段、模型属性或模型方法的名称。方法显示为只读。
如果希望一个字段为只读,请显式添加以下内容:
然后您可以选择通过添加同名的方法完全覆盖字段的显示。您甚至不需要具有该名称的模型字段/方法,然后:
使用
django.utils.safestring.mark_safe
还可以返回HTML代码。管理员的所有其他选项都可用,除了小部件配置,因为它只适用于可写字段。
我可能有点困惑,你想要什么,但你可能想看看模型属性。这是我当前项目的一个例子。
模型中的代码:
然后你可以在管理页面上显示它。
所以现在我可以在管理页面中显示NumWishes,但不需要用模型创建它。
相关问题 更多 >
编程相关推荐