是否可以构建一个显示值但从不将任何内容写回数据库的自定义模型字段/小部件组合?我会专门在管理员的表单中使用这个小部件。
我写了自己的字段,它覆盖了 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,因此管理员是唯一的表单用户。我不想在管理类本身上实现该行为,因为该字段将在各种模型中重复使用,并且应该始终以相同的方式运行。
最佳答案
有多种方法可以在管理页面中创建只读字段。您对数据库存储的要求有点模糊,所以我仔细检查选项。
您必须先在 admin.py
中注册一个 AdminModel:
from django.contrib import admin
from yourapp.models import YourModel
class YourAdmin(admin.ModelAdmin):
pass
admin.site.register(YourModel, YourAdmin)
现在您可以为其添加不同的行为。例如,您可以添加在编辑/添加页面中显示的字段列表:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
这可以是模型字段、模型属性或模型方法的名称。方法以只读方式显示。
如果你想让一个字段只读显式添加:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
readonly_fields = ['field2']
然后您可以选择通过添加同名方法来完全覆盖该字段的显示。您甚至不需要具有该名称的模型字段/方法,然后:
class YourAdmin(admin.ModelAdmin):
fields = ['field1', 'field2']
readonly_fields = ['field2']
def field2(self, obj):
return '*** CLASSIFIED *** {}'.format(obj.field2)
使用 django.utils.safestring.mark_safe
你也可以返回 HTML 代码。
Admin 的所有其他选项都可用,但小部件配置除外,因为它仅适用于可写字段。
关于python - 创建一个只显示(不可编辑)的 Django 管理字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509769/