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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM