django - Django admin get_readonly_fields 不一致的行为
问题描述
我有与其他线程相同的请求,我使用的是 Django 3.2.8
对于我的项目,管理页面中的某些字段必须根据同一模型对象的一个布尔字段的值变为只读,因此我应用了上面另一个线程中建议的解决方案。
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
readonly_fields = ["data"]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
self.readonly_fields = ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return self.readonly_fields
正如我所预料的那样,这个解决方案会导致管理面板出现一些不一致,因为会在内存中生成一个 OrdineAdmin 实例,但它不会在每个请求时更新。因此,当我将字段“pagato”设置为 True 时,此方法会按预期将所有其他字段设置为只读,但如果我将该字段设置回 False,即使通过管理面板的保存过程成功,也不会反转其效果。
这就是为什么我认为需要在__init__()
方法内部完成一些事情,但我阅读了另一个线程的答案,其中关于内联管理元素,据说它没有意义,与我所相信的相反,因为:
在init中设置这样的值也是没有意义的,因为 Modeladmin 实例只创建一次,并且可能会持续不止一个请求!
所以现在我完全糊涂了。如何在 ModelAdmin 页面上为每个请求授予更新,以使我的只读字段逻辑的行为保持一致?
__init__()
在我这边,我尝试使用该方法获取内部对象,get_object()
但我需要提供我仍然不知道如何访问的对象 ID。但是,如果我在上面阅读的内容属实,那么向构造函数提供逻辑仍然是无用的,因为无论如何实例的持续时间都比请求长。
也许我应该使用get_form()
或在我的情况下处理表单get_formsets_with_inlines()
并自定义这些方法?但是我如何确保它们在每次请求时重新生成?
解决方案
当pagato
设置为 True 时,您将readonly_fields
使用以下行覆盖该属性:
self.readonly_fields = ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
所以当pagato
再次设置为 False 时,get_readonly_fields
返回更新版本而不是原始版本。
试试这个:
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
readonly_fields = ["data"]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
return ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return self.readonly_fields
或者更简洁:
class OrdineAdmin(admin.ModelAdmin):
inlines = [
FatturaAdmin
]
def get_readonly_fields(self, request, obj=None):
if obj and obj.pagato == True:
return ['utente', 'abbonamento', 'importo', 'giorni_attivi_abbonamento', 'data']
return ["data"]
推荐阅读
- python - O(log n) 链表搜索算法是否可行?
- c++ - 在 WinRT 中,如何对 png 进行编码,但将其作为内存 bmp 保存在内存中,而不是将其写入文件?
- html - 输入字段超出父 div
- android - 使用 Motion Layout 折叠基于回收器视图或滚动视图移动的自定义视图
- entity - 如何检测输入何时不在实体列表中
- python - Python numba/GPU 装饰器,用于具有矩形矩阵输入和不同矩形矩阵输出的向量化方程
- sas - SAS EG 7.1 的隐藏字符串到日期格式
- javascript - 光滑的滑块不显示第一个元素
- hyperlink - 分页 laravel 8 {{$con->links()}} 不起作用
- javascript - 在鼠标悬停更改图像 8 秒暂停并更改为另一个