近日在研究 Django admin 的二次开发,做一些笔记。
list_display 相关
- list_display 决定管理页都显示哪些字段,可直接使用 models 中已定义的字段
- 也可为一个函数,值为函数的返回值,字段名使用该函数的 short_description 属性。
list_display = ('text', 'create_time', 'text_length')
list_filter = ['create_time',]
def text_length(self, obj):
return len(obj.text)
text_length.short_description = u'文本长度'
- get_list_display 方法返回 list_display 的数据,可通过此方法根据不同情况显示不同的字段
class AnnouncementAdmin(admin.ModelAdmin):
list_display = ('text', 'create_time')
list_filter = ['create_time',]
def text_length(self, obj):
return len(obj.text)
text_length.short_description = u'文本长度'
def text_first(self, obj):
return obj.text[0] if len(obj.text)>0 else "此处无内容"
text_first.short_description = u'文本首字符'
def get_list_display(self, request):
if ( not request.user.is_superuser):
self.list_display += ("text_length", )
else:
self.list_display += ("text_first", )
return self.list_display
change_view (修改数据)相关
- change_view 为修改数据时的函数,可以此还定制修改相关的操作
(出于安全考虑,不在 fields 的字段添加也没用,readonly_fields 中的字段修改时会报错
def change_view(self, request, object_id, extra_context=None):
if request.method == "POST": #提交修改
# request.POST 和 request.GET 均为 Querydict 对象,默认不可修改,使用copy方法使其可修改
request.POST = request.POST.copy()
request.POST['text'] += '12321'
return super(AnnouncementAdmin,self).change_view(request, object_id, extra_context)
elif request.method == "GET": # 进入修改页面
return HttpResponse("this is a GET post")
- save_model 在保存函数时调用,可用此方法重定义数据的保存
由于这里的数据已经经过处理,所有的数据都可以修改,包括 readline_fields 中的字段,当然前提是合法
建设所有数据的保存在 save_model 中操作,请求及验证在 change_view 中进行
def save_model(self, request, obj,form, change):
if change: # 若是修改页面提交,则 change = True
obj.name += ' -- add'
obj.save() # 最后或者调用 obj.save,或调用你们类的 save_model 方法,否则所有的数据都不会保存
else:
return super(LiveAdmin,self).save_model(request, obj, form, change)
参考:Django 自定义 Admin change page 的一般方法
发现一篇更全在,在此记录:这里写链接内容