小陆同学

python 中文名:蟒蛇,设计者:Guido van Rossum

导航

django--xadmin展示一对多关联信息

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

 

posted on 2020-09-26 14:22  小陆同学  阅读(1012)  评论(0编辑  收藏  举报