2 回答

TA貢獻1820條經驗 獲得超10個贊
您可能需要重寫 get_fields 和 get_readonly_fields 方法:
def _get_non_field_names(self, obj, candidate_fields):
for field in candidate_fields:
if hasattr(obj, field) and getattr(obj, field):
yield field
elif getattr(self, field)(obj):
yield field
def get_fields(self, request, obj=None):
form = self._get_form_for_get_fields(request, obj)
candidate_fields = self.fields if self.fields else list(form.base_fields)
fields = self._get_non_field_names(obj, candidate_fields)
readonly_fields = list(self.get_readonly_fields(request, obj))
return list(fields) + readonly_fields
def get_readonly_fields(self, request, obj=None):
candidate_readonly_fields = self.readonly_fields
readonly_fields = list(self._get_non_field_names(obj, candidate_readonly_fields))
return readonly_fields

TA貢獻1797條經驗 獲得超4個贊
困難的部分仍然是在自定義字段上檢查 None 值。
目前我只使用以下 get_fields 來檢查,邏輯性不大,但仍然可以從表單中刪除字段:
def get_fields(self, request, obj=None):
fields = super(WithdrawalsAdmin, self).get_fields(request, obj)
fields_list = list(fields)
if obj:
if obj.to_address is None:
fields_list.remove('to_address')
.... #and other fields
fields_tuple = tuple(fields_list)
return fields_tuple
添加回答
舉報