我和另一個執行緒有相同的請求,我使用的是 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()并自定義這些方法?但是我如何確保它們在每次請求時都重新生成?
uj5u.com熱心網友回復:
當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"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355221.html
