- 如何修改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即可。
- 课程保存时刷新该课程所在机构下的课程数
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获取到新添加的模型实例,之后保存,如果这里不保存的话,后面计算机构的课程数时会少算新添加的这个。