一、前言
本Part,將介紹Django-Xadmin的布局自定義方式。
參考了UserAdmin的布局改寫:https://www.cnblogs.com/adc8868/p/7506973.html
但是我門總是不僅僅局限於用戶管理這個頁面的改寫,所以本Part將以practise.Basic這個錄入控件案例為例,介紹如何在Xadmin快速布局。
二、目錄結構總覽
1、本part,我們在這個結構下進行代碼填充:
Project 目錄 (Django-Xadmin學習項目) | |-- app | `-- practise ...
三、官方代碼
1、首先我們先看看Xadmin中UserAdmin的布局是怎么寫的
(1)如果是extra_app拷到項目中的,則找到這個路徑
打開項目中的:/extra_app/
找到這個文件:xadmin/plugins/auth.py
(2)如果是pip安裝到Python環境中的,則找到這個路徑
到你的Python環境:D:\Programs\Python\Python36\venv\xadmin_learn\Lib\site-packages
找到這個文件:xadmin/plugins/auth.py
2、找到UserAdmin類的get_form_layout方法(大概在83行):
... class UserAdmin(object): ... def get_form_layout(self): ...
3、對着用戶管理界面,學習布局的代碼。
四、效果圖
1、首先這次我們要對practise.Basic的布局進行改造,我們看看原來的布局是怎么樣的
2、再看看自定義布局后的樣子
3、可以看出來,布局可以更緊湊,更靈活
五、追加代碼
1、在project/app/practise/adminx.py的class BasicAdmin,屬性的下方,追加這個方法:
# -*- coding: utf-8 -*- import xadmin # 這也是追加的 from django.utils.translation import ugettext as _ from xadmin.layout import Fieldset, Main, Side, Row from .models import Basic class BasicAdmin(object): list_display = ['input_single'] # 控制顯示列數 search_fields = ['input_single'] # 控制搜索框的顯示 list_filter = ['input_single'] # 控制篩選 # 這是追加的 def get_form_layout(self): self.form_layout = ( Main( Fieldset(_('文本錄入案例'), 'input_single', 'input_multi', 'input_slug', Row('input_integer', 'input_positive_integer',), Row('input_float', 'input_big_integer', ), ), Fieldset(_('日期錄入案例'), Row('input_date', 'input_time'), 'input_datetime' ), Fieldset(_('網絡錄入案例'), 'input_url', 'input_email', 'input_generic_ip', ), Fieldset('', 'add_time', css_class='unsort no_title' ), ), Side( Fieldset(_('其他'), 'input_null_boolean' ), Fieldset(_('其他'), 'input_null_boolean' ), ) ) return super(BasicAdmin, self).get_form_layout() xadmin.site.register(Basic, BasicAdmin)
2、從代碼可以看出,要進行自定義xadmin布局,要做2個步驟:
(1)在import上引入了一些依賴;
(2)在class里面,追加了一個方法“get_form_layout(self)”
3、其中“get_form_layout(self)”方法和UserAdmin中“get_form_layout(self)”最大的不同,是UserAdmin多了一行
if self.org_obj:
的判斷,而我們自己定義的類中,是不需要這個判斷的。
作者:不願透露姓名的擼大濕
鏈接:https://www.jianshu.com/p/c381832dc5ff
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
