# 需要顯示的列
list_display = ['fbm_display']
# 實時編輯功能 list_editable = ['reason_one', 'low_price', 'artificial_confirm_stock_no_fbn']
# 因為這個字段后期要加一些顯示的邏輯,所以需要自定義,但是又希望能支持實時編輯
def fbm_display(self, row):
return row.artificial_confirm_stock_no_fbn
fbm_display.short_description = '補FBM'
1. 修改models
class Goods(models.Model): ''' 商品表 ''' artificial_confirm_stock_no_fbn = models.IntegerField(verbose_name='人工海外補貨', default=-1) # 在表中添加一個函數,函數名要跟自定義字段的名字相同 def fbm_display(self): return 'artificial_confirm_stock_no_fbn'
2 修改 xadmin/util.py
def lookup_field(name, obj, model_admin=None): opts = obj._meta try: f = opts.get_field(name) except models.FieldDoesNotExist: # For non-field values, the value is either a method, property or # returned via a callable. if callable(name): attr = name value = attr(obj) elif ( model_admin is not None and hasattr(model_admin, name) and name not in ('__str__', '__unicode__') ): attr = getattr(model_admin, name) value = attr(obj) else: if is_rel_field(name, obj): parts = name.split("__") rel_name, sub_rel_name = parts[0], "__".join(parts[1:]) rel_obj = getattr(obj, rel_name) if rel_obj is not None: return lookup_field(sub_rel_name, rel_obj, model_admin) attr = getattr(obj, name) if callable(attr): value = attr() else: value = attr f = None # 目的是為了傳回字段 if hasattr(obj, name): field = getattr(obj, name)() opts = obj._meta f = opts.get_field(field) # 添加完畢 else: attr = None value = getattr(obj, name) return f, attr, value
3.修改 xadmin/plugins/editable.py
def result_item(self, item, obj, field_name, row): # 將list_display中的自定義字段名 跟 list_editable中的字段名綁定 model_fields = [f.name for f in self.opts.fields] if hasattr(self.model, field_name) and field_name not in model_fields: field_name = getattr(self.model, field_name)(self) # 添加完畢 if self.list_editable and item.field and item.field.editable and (field_name in self.list_editable): pk = getattr(obj, obj._meta.pk.attname) field_label = label_for_field(field_name, obj, model_admin=self.admin_view, return_attr=False ) item.wraps.insert(0, '<span class="editable-field">%s</span>') item.btns.append(( '<a class="editable-handler" title="%s" data-editable-field="%s" data-editable-loadurl="%s">' + '<i class="fa fa-edit"></i></a>') % (_(u"Enter %s") % field_label, field_name, self.admin_view.model_admin_url('patch', pk) + '?fields=' + field_name)) if field_name not in self.editable_need_fields: self.editable_need_fields[field_name] = item.field return item
