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)