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