Xadmin自定义开发 笔记(一)

  • 如何修改xadmin中模型的图标  

        其实只需要在app中的adminx.py对应的模型的注册类下添加一句即可

    model_icon = 'fa fa-envelope'

        当然这里是因为xadmin使用的第三方fontawesome的图标,所以这样使用。你可以自行在fontawesome官网查找你喜欢的图标进行修改。格式为model_icon = 'fa fa-xxxx'。


  • 使用ajax动态加载列表

        当你的模型中有外键,在后台添加数据时,会出现一个列表来供你选择

        

        比如这样,不过如果当数据量增大,你还要从列表中查找你需要选择的数据,那就很不方便了。

        所以,xadmin自带了使用ajax动态加载列表的功能,只需要在外键的注册类中添加下面代码即可

    relfield_style = 'fa-ajax'

  • 后台查看时使用默认排序

        需要在后台查看某个模型的列表时给它默认按照某一项排序时,在模型注册类中加入下面的代码

    ordering = ['-click_num']

        list里是你需要排序的根据,直接使用模型中的字段名称即可


  • 模型某个字段在后台中改为只读类型\模型某个字段在后台中不显示\模型某个字段在后台可直接修改\计时

        当一些字段只适合查看的时候,就需要在模型注册类中做出如下添加

    readonly_fields = ['fav_nums', 'click_num', 'students']
    list_editable = ['degree', 'desc'] # 列表页直接编辑修改
    exclude = ['', ]  # 不显示字段
    refresh_times = [3, 5] # 计时刷新
                                      
         当你查看的时候,该字段会成为只读属性                        字段可以直接在列表进行修改                                计时刷新按钮

  •    模型列表中需要显示自定义字段   

        当你需要在模型列表中使用自定义字段时,可以直接使用模型中定义的类方法,xadmin将其看作字段,可以和字段一样正常使用

    def get_zj_nums(self):
        return self.lesson_set.all().count()

        这里我在课程model里定义了一个返回该课程所有章节的方法,然后在课程的模型注册类中,在list_display列表里添加'get_zj_nums'即可,不过这时在列表中显示如下。

     

        显示的是我们方法的名字,并不是我们想要的章节数,所以得在模型的方法中作出修改

    get_zj_nums.short_description = "章节数"
        修改后,显示出你期待的正确值,这样就可以自定义字段在列表中显示了。

  • 使用一个注册类管理多个模型

        举个例子,当你具有两个模型,一个课程,一个章节。如果按照之前分开的注册类,当注册新的课程时,想添加该课程的章节,必须先添加课程后,再到章节的模型,添加该课程的章节。这样就很麻烦,所以xadmin可以将章节添加到课程添加界面

    class LessonInline(object):
        model = Lesson
        extra = 0

        在课程adminx.py文件中添加上面的类

    inlines = [LessonInline]

        在课程的注册类中添加上面属性即可



  • 将某一类模型分类

        如果有一个模型有一个属性可以把它们分成两类,就比如你的公司有一批成员,但其中一些人时管理层,这时是不是需要重新定义一个新的模型是管理层,一个是员工层,但是这两个模型实质上处理的是一张表,都是公司成员。那怎么操作呢?如下:

        先在model文件中创建新的模型(我这里是课程由是否轮播来划分的,以此类推) 

    class BannerCourse(Course):
        class Meta:
            verbose_name = "轮播课程"
            verbose_name_plural = verbose_name
            proxy = True # 设置为True 否则会重新注册一张数据表

        BannerCourse继承Course类,所以模型中的字段和Course完全一致,但注意一点proxy必须是True,这样在整合数据库时才不会新建一张数据表。

        创建好模型后,就得实现该模型由你规定的属性分类这个方法,下面重写模型中的queryset方法,获取到相应的数据

    def queryset(self):
        qs = super(CourseAdmin, self).queryset()
        qs = qs.filter(is_banner=False)
        return qs

        这里我的模型中有一个字段是is_banner,这个字段是布尔型,判断是否为轮播图

        下来,我们需要在adminx.py中创建BannerCourse的注册类,把Course的注册类复制过来,然后修改is_banner = True即可。

       

  • 课程保存时刷新该课程所在机构下的课程数
        添加过课程后,该课程所在的机构中的课程数是不会自己刷新的,需要手动进行修改,所以这里重写模型的save_models方法,在其中添加逻辑来刷新课程数。
    def save_models(self):
        # 保存课程的时候统计课程机构的课程数

        obj = self.new_obj
        obj.save()
        if obj.course_org is not None:
            course_org = obj.course_org
            course_org.course_nums = Course.objects.filter(course_org=course_org).count()
            course_org.save()
        self.new_obj获取到新添加的模型实例,之后保存,如果这里不保存的话,后面计算机构的课程数时会少算新添加的这个。


猜你喜欢

转载自blog.csdn.net/Sun_White_Boy/article/details/80691414
今日推荐