xadmin:是django的一套优于admin的后台管理系统,不仅提供了可观性更高的UI界面,还封装了基于模型类的CURD,支持过滤查询,多种形式的数据导出,还有很多方便易用的小插件。
它的缺点是,如果有一些自定义的功能,页面展示部分和权限控制部分可能需要改底层代码,不是特别方便
我的场景是,一对多的关系表,如何以一去查多
models.py
class Assets(models.Model): subject = models.CharField(max_length=30,verbose_name="主体",choices=()) kinds = models.CharField(max_length=25, default='领用', choices=(), verbose_name='种类') user = models.ForeignKey(UserProfile, default=152, verbose_name='执行人') close_time = models.DateTimeField(verbose_name='结束时间') def __str__(self): return "%s" % (self.subject) class Meta: verbose_name = "一表" verbose_name_plural = verbose_name
class AssetsRecord(models.Model): info = models.ForeignKey(AssetsCheck,verbose_name='一表外键') num = models.CharField(max_length=30,verbose_name="编号") status = models.BooleanField(verbose_name='状态') def __str__(self): return "%s" %(self.num) class Meta: verbose_name = "多表" verbose_name_plural = verbose_name
截图展示的是一表,想要实现点击查看详情出现它所对应的多表的信息
在网上找了很多方法,也咨询过一些人,没有什么特别高效的方法,只能是自建templates,但是由于我本人不想抛弃当前的xadmin,因为其自带的一些方法实在是太方便了,
于是我在想,它自带的过滤器和查询是什么原理实现的,很容易发现,url传参,那么在如何查询外键字段呢?
?_rel_info__id__exact=id
其中info,是我外键的字段,这样很快就可以实现关联作用,省了好多事儿了,
代码:
xadmin.py
from django.utils.safestring import mark_safe class AssetsAdmin(object): list_display = ['subject','kinds','user','record_button','close_time'] search_fields = ['subject','kinds','user','close_time'] list_filter = ['subject','kinds','user','close_time'] # def record_button(self, obj): button = '<a class="icon fa fa-detail" style="color: violet" href="/assets/assetsrecord/?_rel_info__id__exact=%s">查看详情</a>' % obj.id return mark_safe(button) record_button.short_description = '<span style="color: violet">查看详情</span>' record_button.allow_tags = True xadmin.site.register(Assets,AssetsAdmin) class AssetsRecordAdmin(object): list_display = ['get_check_info','num','status'] search_fields = ['num','status'] list_filter = ['info__close_time','num','status'] def get_check_info(self,obj): return obj.info.id get_check_info.short_description = '详情ID' form_layout = ( Main( Fieldset("基本信息", Row("info"), Row("num"), ), Fieldset("详细信息信息", ), ), Side( Fieldset(('Status'), 'status' ), ) ) xadmin.site.register(AssetsRecord, AssetsRecordAdmin)
大功告成,简直不要太方便了
from django.utils.safestring import mark_safe