5-后台管理-2
search_fields给model增加搜索框
因为有时候要过滤数据,所以,搜索框是必不可少的,search_fileds属性增加搜索框,引用其余model的属性时用双下划线
class TopicAdmin(admin.ModelAdmin): #搜索框 search_fields = ['title','is_online','user__username'] #尴尬的一点是,因为我前面把有些数据做处理了,所以,搜索的时候是按照数据库里面存储的值来搜的。它产生的sql语句是按照like搜索的,个人认为挺好的
list_filter增加过滤器(每个过滤器之间的关系是and的关系)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): #搜索框 search_fields = ['title','is_online','user__username'] #过滤器 list_filter = ['is_online','user__username']
也可以使用内部类的方法进行过滤,还可以更改过滤条件的名字
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): #搜索框 search_fields = ['title','is_online','user__username'] #内部类方式,继承django.contrib.admin.SimpleListFilter class onlineFilter(admin.SimpleListFilter): title = ('是否在线')#过滤器显示的名字,SimpleListFilter的属性之一 parameter_name = 'whether_online'#url中携带的参数,SimpleListFilter的属性之一 def lookups(self, request, model_admin):#SimpleListFilter的属性之一,返回一个列表或者元组, return ( ('1',('在线')),#第一个参数为查询参数,用self.value()获取,建议对照数据库写,第二个参数是描述 ('0',('退线')) ) def queryset(self, request, queryset):#SimpleListFilter的属性之一,过滤器根据loockups的第一个参数返回的结果, if self.value()=='1': return queryset.filter(is_online__exact=1) elif self.value()=='0': return queryset.filter(is_online__exact=0) else: return queryset # 过滤器 list_filter = [onlineFilter,'user__username']
分页
list_per_page = 2#每页显示2个 list_max_show_all = 10#点击显示全部,每页显示4个;如果配置的小与总数,则不会出现显示全部,
get_queryset限制返回数据
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): def get_queryset(self, request): loctiontime = time.localtime(time.time()) return self.model.objects.filter(create_time__contains=loctiontime.tm_year)#只显示今年创建的数据
fileds自定义显示每条数据的详情页面(其余的方法就不写了,这个会影响使用,在详情界面添加数据时因为有些数据被屏蔽,会造成添加失败的可能)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): fields = ['title','content']#设置的顺序也会影响在详情界面显示的顺序
当然用exclude属性也可以屏蔽自己不想看见的字段
fieldsets分组显示字段
fieldsets是一个二元组列表,格式为:(name,field_options)。name是分组名称,field_options(有三个关键字:fields,必填,显示的字段;classes,选填,包含css列表或元组(常用样式为:collapse:折叠分组;wide:给分组额外水平空间);description,选填,描述信息)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): #fields = ['title','content']#设置的顺序也会影响在详情界面显示的顺序 fieldsets = ( ('Topic A',{ 'fields':('title','user'), 'description':'title和用户' }),('Topic B',{ 'fields': ('content', 'is_online'), 'classes':['collapse','wide'], 'description': 'content和是否在线' }) )
readonly_fields将显示的字段显示为只读属性(可以和fields一起使用)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): readonly_fields = ['title','user','content_len'] def content_len(self,obj): return len(obj.content) content_len.short_description=u'内容长度'
raw_id_fields降低检索开销(元组或者列表,其中包含的每一个字段必须是ForeihnKey或者是ManytoManyFields,设置raw_id_fields时,系统不会去查询这个字段的所有值了,而是用户自己决定)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): raw_id_fields = ('user',)
save_model定制实例对象的保存操作(保存实例对象时可有额外操作,接收四个参数:一次请求,model实例,modelform实例和标记是否添加或修改实例的布尔值)
@admin.register(Topic) class TopicAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): if change and 'is_online' in form.changed_data and not obj.is_online: ''' 判断change是否为true,确定这是一个修改动作 判断is_online是否出现在form.change_data中,form.change_data记录全部字段 判断is_online是否为false,代表实例被删除(标记删除) ''' self.message_user(request,'%s被管理员删除了'%obj.title) super(Topic,self).save_model(self, request, obj, form, change)