是否可以構建一個自定義模型字段/窗口小部件組合,該組合顯示值但不會將任何內容寫回數據庫?我只會在管理員的表單中使用這個小部件。創建僅顯示(不可編輯)的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,所以管理員是唯一的窗體用戶。我不想在管理類本身上實現這種行爲,因爲這個字段將在各種模型中重用,並且總是應該以相同的方式運行。
作爲一種臨時解決方案,我已經爲我的窗口小部件渲染器添加了一個隱藏字段,但這只是感覺不對:現在我通過瀏覽器發送序列化的字段內容,然後將它們反序列化,而不僅僅是從保存操作中刪除這一個字段。 –