django 安裝xadmin 替代admin

01-下載源碼 安裝

https://github.com/sshwsfc/xadmin 

Install
Xadmin is best installed via PyPI. To install the latest version, run:

pip install xadmin
or Install from github source:

pip install git+git://github.com/sshwsfc/xadmin.git
Install from github source for Django 2.0:

pip install git+git://github.com/sshwsfc/xadmin.git@django2

https://github.com/sshwsfc/xadmin/tree/django2  打開github,找到xadmin源碼,點擊branch,然後選擇django2版本,全新的已經變成前端了,clone or download

把zip文件放到pip目錄下,運行下面命令安裝:

pip install xadmin-django2

*********************************************************************************************************

(venv) D:\zz\PycharmProjects\output\venv\Lib\site-packages>pip install xadmin-django2.zip

(venv) D:\zz\PycharmProjects\output\venv\Lib\site-packages>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xadmin-django2.zip
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Processing d:\zz\pycharmprojects\output\venv\lib\site-packages\xadmin-django2.zip
Requirement already satisfied: setuptools in c:\python\python37\lib\site-packages (from xadmin==2.0.1) (39.0.1)
Requirement already satisfied: django>=2 in c:\python\python37\lib\site-packages (from xadmin==2.0.1) (2.1.1)
Collecting django-crispy-forms>=1.6.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c5/1e/166304128017b1dc45c6b79af753af93f6a0939c7ecca4258ca573aed8cd/django_crispy_forms-1.9.0-py2.py3-none-any.whl (107 kB)
     |████████████████████████████████| 107 kB 819 kB/s
Collecting django-reversion>=2.0.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d9/c2/67e6fd0b67e1283e7608e5798ba5e78c842a0e25af80038d4913cf0d18ea/django_reversion-3.0.7-py3-none-any.whl (84 kB)
     |████████████████████████████████| 84 kB 694 kB/s
Collecting django-formtools>=1.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/16/2b/f2dc15cf7fb830bf22ec87739786ca7633902474edd7cdb9c52a56434ed2/django_formtools-2.2-py2.py3-none-any.whl (148 kB)
     |████████████████████████████████| 148 kB 2.2 MB/s
Collecting django-import-export>=0.5.1
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ad/a0/f7da2f39dfcbb6e0416ab0803900bec3797b3013cb7d2737dbd91221316d/django_import_export-2.0.2-py3-none-any.whl (82 kB)
     |████████████████████████████████| 82 kB 142 kB/s
Collecting httplib2==0.9.2
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ff/a9/5751cdf17a70ea89f6dde23ceb1705bfb638fd8cee00f845308bf8d26397/httplib2-0.9.2.tar.gz (205 kB)
     |████████████████████████████████| 205 kB 6.8 MB/s
Collecting future
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz (829 kB)
     |████████████████████████████████| 829 kB 6.4 MB/s
Requirement already satisfied: six in c:\python\python37\lib\site-packages (from xadmin==2.0.1) (1.11.0)
Requirement already satisfied: pytz in c:\python\python37\lib\site-packages (from django>=2->xadmin==2.0.1) (2018.5)
Collecting tablib[html,ods,xls,xlsx,yaml]>=0.14.0
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/7b/68/6ebc32ee79945feac078713f3fe3dc280f328d10d178674dc1227ade8d01/tablib-1.1.0-py3-none-any.whl (47 kB)
     |████████████████████████████████| 47 kB 2.1 MB/s
Collecting diff-match-patch
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f0/2a/5ba07def0e9107d935aba62cf632afbd0f7c723a98af47ccbcab753d2452/diff-match-patch-20181111.tar.gz (58 kB)
     |████████████████████████████████| 58 kB 1.0 MB/s
Collecting markuppy; extra == "html"
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4e/ca/f43541b41bd17fc945cfae7ea44f1661dc21ea65ecc944a6fa138eead94c/MarkupPy-1.14.tar.gz (6.8 kB)
Collecting odfpy; extra == "ods"
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/97/73/8ade73f6749177003f7ce3304f524774adda96e6aaab30ea79fd8fda7934/odfpy-1.4.1.tar.gz (717 kB)
     |████████████████████████████████| 717 kB 6.4 MB/s
Collecting xlrd; extra == "xls"
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/b0/16/63576a1a001752e34bf8ea62e367997530dc553b689356b9879339cf45a4/xlrd-1.2.0-py2.py3-none-any.whl (103 kB)
     |████████████████████████████████| 103 kB 6.4 MB/s
Collecting xlwt; extra == "xls"
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/44/48/def306413b25c3d01753603b1a222a011b8621aed27cd7f89cbc27e6b0f4/xlwt-1.3.0-py2.py3-none-any.whl (99 kB)
     |████████████████████████████████| 99 kB 2.4 MB/s
Collecting openpyxl>=2.4.0; extra == "xlsx"
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/95/8c/83563c60489954e5b80f9e2596b93a68e1ac4e4a730deb1aae632066d704/openpyxl-3.0.3.tar.gz (172 kB)
Requirement already satisfied: pyyaml; extra == "yaml" in c:\python\python37\lib\site-packages (from tablib[html,ods,xls,xlsx,yaml]>=0.14.0->django-import-export>=0.5.1->xadmin==2.0.1) (
5.1.2)
Collecting defusedxml
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/06/74/9b387472866358ebc08732de3da6dc48e44b0aacd2ddaa5cb85ab7e986a2/defusedxml-0.6.0-py2.py3-none-any.whl (23 kB)
Collecting jdcal
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/f0/da/572cbc0bc582390480bbd7c4e93d14dc46079778ed915b505dc494b37c57/jdcal-1.4.1-py2.py3-none-any.whl (9.5 kB)
Collecting et_xmlfile
  Using cached https://pypi.tuna.tsinghua.edu.cn/packages/22/28/a99c42aea746e18382ad9fb36f64c1c1f04216f41797f2f0fa567da11388/et_xmlfile-1.0.1.tar.gz (8.4 kB)
Installing collected packages: django-crispy-forms, django-reversion, django-formtools, markuppy, defusedxml, odfpy, xlrd, xlwt, jdcal, et-xmlfile, openpyxl, tablib, diff-match-patch, dj
ango-import-export, httplib2, future, xadmin
    Running setup.py install for markuppy ... done
    Running setup.py install for odfpy ... done
    Running setup.py install for et-xmlfile ... done
    Running setup.py install for openpyxl ... done
    Running setup.py install for diff-match-patch ... done
    Running setup.py install for httplib2 ... done
    Running setup.py install for future ... done
    Running setup.py install for xadmin ... done
Successfully installed defusedxml-0.6.0 diff-match-patch-20181111 django-crispy-forms-1.9.0 django-formtools-2.2 django-import-export-2.0.2 django-reversion-3.0.7 et-xmlfile-1.0.1 future
-0.18.2 httplib2-0.9.2 jdcal-1.4.1 markuppy-1.14 odfpy-1.4.1 openpyxl-3.0.3 tablib-1.1.0 xadmin-2.0.1 xlrd-1.2.0 xlwt-1.3.0

**********************************************************或者更換安裝源(使用豆瓣源)

pip install -i https://pypi.douban.com/simple xadmin-django2.zip
由於使用的是Django2.0的版本,所以需要安裝xadmin項目django2分支的代碼。 
在PyCharm裏打開命令行工具,輸入以下命令完成安裝:
pip install git+git://github.com/sshwsfc/xadmin.git@django2
 
也可以使用https的地址安裝,命令如下:
pip install git+https://github.com/sshwsfc/xadmin.git@django2

安裝成功後,同時也安裝了很多依賴的包。

爲了主題和全局配置,需要導入views

  • 1、項目中新建目錄 extra_apps (名稱可自定義),作爲第三方依賴的存放目錄
  • 2、選中 extra_apps 目錄,右擊Mark Directory as > Resource Root
  • 配置項目 setting 新增搜索目錄 extra_apps

    STATIC_URL = '/static/'
    STATIC_ROOT = 'APP/static'
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR,"APP/static/html"),
        os.path.join(BASE_DIR, 'extra_apps'),)

02-配置settings.py

settings.py文件 
INSTALLED_APPS中添加xadmin的安裝

INSTALLED_APPS = (
    ...
    'xadmin',
    'crispy_forms',
    'reversion',
    ...
)

# 修改使用中文界面
LANGUAGE_CODE = 'zh-Hans'
 
# 修改時區
TIME_ZONE = 'Asia/Shanghai'
 
ALLOWED_HOSTS = ['*', ]

03-配置路由

urls.py文件 
urls裏面要添加xadmin的匹配,示例如下:

import xadmin
path('xadmin/', xadmin.site.urls),

或者更詳細的配置


# urls.py
 
# -*- coding: utf-8 -*-
# from django.conf.urls import include, url
from django.urls import include, path
 
# Uncomment the next two lines to enable the admin:
import xadmin
xadmin.autodiscover()
 
# version模塊自動註冊需要版本控制的 Model
from xadmin.plugins import xversion
xversion.register_models()
 
from django.contrib import admin
 
urlpatterns = [
    path(r'xadmin/', xadmin.site.urls)
]

04-創建數據庫

python manage.py makemigrations
python manage.py migrate

05-創建超級用戶

python manage.py createsuperuser

06-拉取靜態文件到本地

python manage.py collectstatic

07-站點Model管理

 
xadmin 可以使用的頁面樣式控制基本與Django原生的admin一直。
 
list_display         列表展示的字段
 
preserve_filters  默認情況下,當你對目標進行創建、編輯或刪除操作後,頁面會依然保持原來的過濾狀態。將preserve_filters設爲False後,則會返回未過濾狀態。
 
prepopulated_fields  設置預填充字段。不接收DateTimeField、ForeignKey和ManyToManyField類型的字段。
 
view_on_site  這個屬性可以控制是否在admin頁面顯示“View site”的鏈接。這個鏈接主要用於跳轉到你指定的URL頁面。
 
free_query_filter 屬性: 默認爲 True , 指定是否可以自由搜索. 如果開啓自由搜索, 用戶可以通過 url 參數來進行特定的搜索, 
search_fields        可以通過搜索框搜索的字段名稱,xadmin使用的是 模糊查詢,存在外鍵 同 list_filter 一樣  注意:只能包括 字符類型,不能有 非字符類型 如:SBBH-20180515-0002
list_filter          可以進行過濾操作的列,例如:存在外鍵字段class ---》student__class 獲取值
ordering             默認排序的字段
readonly_fields      在編輯頁面的只讀字段
exclude              在編輯頁面隱藏的字段
list_editable        在列表頁可以快速直接編輯的字段
show_detail_fileds   在列表頁顯示詳情信息
refresh_times        指定列表頁的數據定時刷新   例如:refresh_times=(3,5)
list_export          控制列表頁導出數據的類型
show_bookmarks       控制是否顯示書籤功能
data_charts          控制顯示圖標的樣式
model_icon           配置表的圖標,可以在 awesome 上下載最新的font-awesome.css 替換,並尋找相應的icon書寫
fieldsets          ,詳細頁面時,使用fieldsets標籤對數據進行分割顯示
empty_value_display = "列數據爲空時,顯示默認值"
#  列聚合,可用的值:"count","min","max","avg",  "sum"
aggregate_fields = {"expire": "max"}
 
# 顯示還原按鈕,刪除修改的信息可以還原
reversion_enable = True
 
# 添加數據時候,一步一步提供數據
wizard_form_list = [
    ("基礎信息", ("name", "contact", "telphone", "address")),
    ("其它信息", ("customer_id", "expire", "description")),
]
 
fields               表單顯示內容, 不包含在內的字段不能編輯
filter_horizontal    從‘多選框’的形式改變爲‘過濾器’的方式,水平排列過濾器,必須是一個 ManyToManyField類型,且不能用於 ForeignKey字段,默認地,管理工具使用下拉框 來展現外鍵 字段
 
raw_id_fields       將ForeignKey字段從‘下拉框’改變爲‘文本框’顯示
 
relfield_style      後臺自定義不是下拉選擇框,而是搜索框(解決了爲什麼用戶不是下拉框的問題。。) relfield_style = 'fk-ajax'
exclude             在編輯和查看列表時指定不顯示的字段
list_editable       列表顯示的時候,指定的字段可以直接頁面一鍵編輯
list_display_links   設置默認可編輯字段
list_per_page = 20   每頁顯示20個
actions = ('ocr_action', 'excel_action', 'auto_excel_action') 在類中自定義的函數方法
auto_excel_action.short_description='自動化導入數據文件'         函數名描述
 
object_list_template = "test.html"   自定義頁面
 
data_charts          圖表,該屬性爲dict類型,key爲圖表的標示名稱,value爲圖表的具體設置屬性
data_charts = {
        "user_count": {'title': u"約運動",
                       "x-field": "sport_time", 
                       "y-field": ("people_nums",),
                       },
    }
 
圖表屬性:
 
  title :   圖表的顯示名稱
  x-field : 圖表的 X 軸數據列, 一般是日期, 時間等
  y-field : 圖表的 Y 軸數據列, 該項是一個 list, 可以同時設定多個列, 這樣多個列的數據會在同一個圖表中顯示
  order : 排序信息, 如果不寫則使用數據列表的排序
 
    # 導出類型
    list_export = ('xls', 'xml', 'json')   list_export設置爲None來禁用數據導出功能
    #導出字段
    list_export_fields = ('start_people', 'sport', 'sport_time')

 

08-站點的全局配置

 
# settingx/adminx.py
 
import xadmin
from xadmin import viewsclass 
class BaseSetting(object):
    """xadmin的基本配置"""
    enable_themes = True      # 開啓主題切換功能
    use_bootswatch = True     # 支持切換主題
 
xadmin.site.register(views.BaseAdminView, BaseSetting)
 
class GlobalSettings(object):
    """xadmin的全局配置"""
    site_title = "xxx後臺管理系統"   # 設置站點標題
    site_footer = "xxxxxxx"     # 設置站點的頁腳
    menu_style = "accordion"    # 設置菜單摺疊,在左側,默認的
    # 設置models的全局圖標, UserProfile, Sports 爲表名
    global_search_models = [UserProfile, Sports]
    global_models_icon = {
        UserProfile: "glyphicon glyphicon-user", Sports: "fa fa-cloud"
 
xadmin.site.register(views.CommAdminView, GlobalSettings)

 09-app名稱的修改

 
# app名爲users下的apps.py
 
from django.apps import AppConfig
 
 
class UsersConfig(AppConfig):
    # 設置app圖標
    app_icon = 'fa fa-line-chart'
    # app名
    name = 'users'
    verbose_name = u'用戶管理'
 
# __init__.py
 
default_app_config='users.apps.UsersConfig'

 10-自定義導航菜單順序

 
from xadmin import views
 
class GlobalSetting(object):
     def get_site_menu(self):
        return (
            {'title': '課程管理', 'menus': (
                {'title': '課程信息', 'url': self.get_model_url(Course, 'changelist')},
                {'title': '章節信息', 'url': self.get_model_url(Lesson, 'changelist')},
                {'title': '視頻信息', 'url': self.get_model_url(Video, 'changelist')},
                {'title': '課程資源', 'url': self.get_model_url(CourseResource, 'changelist')},
                {'title': '課程評論', 'url': self.get_model_url(CourseComments, 'changelist')},
            )},
            {'title': '機構管理', 'menus': (
                {'title': '所在城市', 'url': self.get_model_url(CityDict, 'changelist')},
                {'title': '機構講師', 'url': self.get_model_url(Teacher, 'changelist')},
                {'title': '機構信息', 'url': self.get_model_url(CourseOrg, 'changelist')},
            )},
            {'title': '用戶管理', 'menus': (
                {'title': '用戶信息', 'url': self.get_model_url(UserProfile, 'changelist')},
                {'title': '用戶驗證', 'url': self.get_model_url(EmailVerifyRecord, 'changelist')},
                {'title': '用戶課程', 'url': self.get_model_url(UserCourse, 'changelist')},
                {'title': '用戶收藏', 'url': self.get_model_url(UserFavorite, 'changelist')},
                {'title': '用戶消息', 'url': self.get_model_url(UserMessage, 'changelist')},
            )},
            {'title': '系統管理', 'menus': (
                {'title': '用戶諮詢', 'url': self.get_model_url(UserAsk, 'changelist')},
                {'title': '首頁輪播', 'url': self.get_model_url(Banner, 'changelist')},
                {'title': '用戶分組', 'url': self.get_model_url(Group, 'changelist')},
                {'title': '用戶權限', 'url': self.get_model_url(Permission, 'changelist')},
                {'title': '日誌記錄', 'url': self.get_model_url(Log, 'changelist')},
            )},
 
xadmin.site.register(views.CommAdminView, GlobalSetting)

11-設置只讀字段

在使用xadmin的時候,ModelAdmin默認只有對於model的增刪改查,但是總是有些字段是不希望用戶來編輯的。而 readonly_fields 設置之後不管是admin還是其他用戶都會變成只讀,而我們通常只是想限制普通用戶。 這時我們就可以通過重寫 get_readonly_fields 方法來實現對特定用戶的只讀顯示。

 
class UserInfoAdmin():
 
    def get_readonly_fields(self, **kwargs):
        """  重新定義此函數,限制普通用戶所能修改的字段  """
        print(self.org_obj)
        if self.user.is_superuser:
            self.readonly_fields = []
        return self.readonly_fields
     
    readonly_fields = ('user_email',)

 12-在list_display顯示自定義函數:

 
list_display = ['get_chapter_num']
 
# 需要在自定義的函數下加上如下內容
def get_chapter_num(self):   
    return self.chapter_set.all().count()
get_chapter_num.short_description= '章節數'

13-設置頁面跳轉,需自定義函數


# 定義自定義的一個跳轉字段, 內部爲html代碼的形式
def go_to(self):
    from django.utils.safestring import mark_safe
    return mark_safe("<a href='http://wwww.baidu.com'>跳轉</a>")
go_to.short_description = "跳轉"

14、如果想添加數據的同時方便添加關聯model:inlines 機制 同一個頁面 可以添加 所有的相關信息

class ChapterInline:
    model = Chapter
    extra = 0
 
在CoursesXadmin 添加 inlines = [ChapterInline]

15-重載顯示樣式

 
from xadmin.layout import Main,Fieldset,Row,Side
 def get_form_layout(self):
    if self.org_obj:
        self.form_layout = (
            Main(
                Fieldset('',
                         'username', 'password',
                         css_class='unsort no_title'
                         ),
                Fieldset(_('Personal info'),
                         Row('first_name', 'last_name'),  # 顯示在一行
                         'email'
                         ),
                Fieldset(_('Permissions'),
                         'groups', 'user_permissions'
                         ),
                Fieldset(_('Important dates'),
                         'last_login', 'date_joined'
                         ),
                ),
            Side(
                Fieldset(_('Status'),
                         'is_active', 'is_staff', 'is_superuser',
               ),
            )
 
        )
    return super(UserAdmin, self).get_form_layout()子主題

16-model的管理器,一個model 分不同情況 管理

 
class Course(models.Model):
    pass
 
class BannerCourse(Course):  # 繼承 父類 course
    class Meta:
        verbose_name = '輪播課程'
        verbose_name_plural = verbose_name
        proxy = True  # 不會生成新的表
 
# 註冊新的表
 
class CourseSourceAdmin(object):
    list_display = ['course', 'name', 'add_time', 'download']
    list_filter = ['course', 'name', 'add_time', 'download']
    search_fields = ['course', 'name', 'download']
 
    def queryset(self):
        qs = super(CourseAdmin, self).queryset()
 
        qs = qs.filter(is_banner=False)
        return qs

17-獲取當前的user表model

from django.contrib.auth import get_user_model  (獲取當前的user表model)
    User = get_user_model()
    site.register(User,Useradmin)

18-卸載註冊的model

from django.contrib.auth.models import User
 
xadmin.site.unregister(User)

19-替換默認的註冊 user(繼承了abstractuser)

 
class UserInfoAdmin(object):
    list_display = ['auth', 'name', 'depart', 'email', 'username']
    list_filter = ['auth', 'name', 'depart', 'email', 'username']
    search_fields = ['auth', 'name', 'depart', 'email', 'username']
    list_editable = ['auth', 'name', 'depart', 'email', 'username']
    list_display_links = ['auth', 'name', 'depart', 'email', 'username']
    model_icon = 'fa fa-user-circle-o'
 
from django.contrib.auth import get_user_model # 獲取當前的user_model
xadmin.site.unregister(get_user_model())    # 註銷 user
xadmin.site.register(UserInfo,UserInfoAdmin) # 註冊新的 user

20-表單根據用戶顯示不同的字段內容  get_model_form

 
import xadmin
# Register your models here.
 
from .models import User
from xadmin.plugins import auth
 
 
class UserAdmin(auth.UserAdmin):
    list_display = ['id', 'username', 'mobile', 'email', 'date_joined']
    readonly_fields = ['last_login', 'date_joined']
    search_fields = ('username', 'first_name', 'last_name', 'email', 'mobile')
    style_fields = {'user_permissions': 'm2m_transfer', 'groups': 'm2m_transfer'}
 
    # 表單根據用戶顯示不同的字段內容
    def get_model_form(self, **kwargs):
        if self.org_obj is None:
            self.fields = ['username', 'mobile', 'is_staff']
 
        return super().get_model_form(**kwargs)
 
 
xadmin.site.unregister(User)
xadmin.site.register(User, UserAdmin)

而在 admin 裏是 get_fields

# 表單根據用戶顯示不同的字段內容
def get_fields(self, request, obj=None):

21-模型編輯頁面Field分區顯示--form_layout

在admin.py中我們可以通過Fieldsets去設置字段的分塊顯示,例如以下代碼:
界面顯示會上下分區,分爲名字爲空和名字爲其它的兩個區域。

 
class DeviceAdmin(admin.ModelAdmin):
  ...
  fieldsets = (
    (None, {
        'fields': ('site', 'device_name', 'device_id', 'device_type', 'account', 'password')
    }),
    ('其它', {
        'fields': ('responsible_by', 'device_ip', 'device_model', 'sn_number', 'supplier', 'buy_date', 'expire_date', 'note', 'attachment', 'date'),
    }),
)

而在xadmin.py中,這個字段不再生效,需用form_layout去設置。

可分爲Main主區域和Side側邊區域,Main或Side中又可通過Fieldset再分多個區域。Fieldset爲一個元組,第一個字段爲需要設置的名稱,其它字段均爲模型中的字段名。如下:

 
class DeviceAdmin(object):
  ...
  form_layout = (
    Main(
        Fieldset('基礎信息',
                 'site', 'device_name', 'device_id', 'device_type', 'account', 'password'),
        Fieldset('EXTRA',
                 'device_model', 'supplier', 'responsible_by', 'device_ip', 'sn_number'),
    ),
    Side(
        Fieldset('其它',
                 'buy_date', 'expire_date', 'note', 'attachment', 'date'),
    )
)

22-獲取用戶信息並填充模型字段--save_models

有時模型中會需要記錄添加數據的用戶,保存在created_by這樣的字段中。這時我們就需要重寫save_model方法,在保存模型時存入用戶的信息。

admin.py中會sava_model,如下。

class DeviceAdmin(admin.ModelAdmin):
  ...
  def save_model(self, request, obj, form, change):
    obj.area_company = Group.objects.get(user=request.user)
    super().save_model(request, obj, form, change)

而xadmin.py中改爲使用save_models。

 
class DeviceAdmin(object):
  ...
  def save_models(self):
   obj = self.new_obj
    self.new_obj.area_company = Group.objects.get(user=self.request.user)
    super().save_models()

23-根據登錄用戶或組過濾數據--queryset

需要根據登錄用戶或組過濾數據時,admin.py中是重寫get_queryset方法,xadmin.py中改爲重寫queryset方法即可。如下:

 
class DeviceAdmin(object):
...
def queryset(self):
    """函數作用:使當前登錄的用戶只能看到自己負責的設備"""
    qs = super(DeviceAdmin, self).queryset()
    if self.request.user.is_superuser:
        return qs
    return qs.filter(area_company=Group.objects.get(user=self.request.user))

24-外鍵下拉框添加過濾

admin.py中發現將site字段添加到autocomplete_fields(autocomplete_fields作用是下拉選項會多出一個搜索框,方便搜索選擇)之後,會自動進行過濾,滿足上述場景要求。如果不使用autocomplete_fields,可以通過重寫formfield_for_foreignkey方法去做篩選。如下:

 
class DeviceAdmin(admin.ModelAdmin):
    ...
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if not self.request.user.is_superuser:  # 非superuser進行過濾,superuser可以看到全部
            if db_field.name == "site":
                kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))
        return super(DeviceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

而xadmin.py中沒有這個方法了,需要重寫formfield_for_dbfield方法。如下:

 
class DeviceAdmin(object):
    ...
    def formfield_for_dbfield(self, db_field, **kwargs):
        if not self.request.user.is_superuser:
            if db_field.name == "site":
                 kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))
        return super(DeviceAdmin, self).formfield_for_dbfield(db_field, **kwargs)

25 django自帶的admin是有save_models和delete_model的,後臺修改模型類後就會執行改函數,xadmin中如下

 
def save_models(self):
    # 新的對象
    obj = self.new_obj
    # 可以在這裏面寫些邏輯
    # 保存該對象
    obj.save()
 
def delete_model(self):
    # 刪除數據對象
    obj = self.obj
    # 相應的操作
    obj.delete()

26 定製HTML模板

 
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None

27 xadmin此版本貌似不能加載views.py

作爲破解在 __init__.py中增加了 import views一行,如下:

__init__.py

import views

28、列表視圖新增自定義按鈕

 https://www.cnblogs.com/Tommy-Yu/p/5443127.html

http://www.cnblogs.com/livingintruth/p/3738601.html

29-自定義actions

 
1. 首先要創建一個 Action 類, 該類需要繼承 BaseActionView. BaseActionView 是 ModelAdminView 的子類:
 
from xadmin.plugins.actions import BaseActionView
 
class MyAction(BaseActionView):
 
    # 這裏需要填寫三個屬性
    action_name = "my_action"    #: 相當於這個 Action 的唯一標示, 儘量用比較針對性的名字
    description = _(u'Test selected %(verbose_name_plural)s') #: 描述, 出現在 Action 菜單中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
 
    model_perm = 'change'    #: 該 Action 所需權限
 
    # 而後實現 do_action 方法
    def do_action(self, queryset):
        # queryset 是包含了已經選擇的數據的 queryset
        for obj in queryset:
            # obj 的操作
            ...
        # 返回 HttpResponse
        return HttpResponse(...)
2. 然後在 Model 的 OptionClass 中使用這個 Action:
 
class MyModelAdmin(object):
 
    actions = [MyAction, ]
3. 這樣就完成了自己的 Action。

30給這個方法添加一個boolean的屬性並賦值爲True,它將顯示爲on/off的圖標

 
from django.db import models
from django.contrib import admin
 
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    birthday = models.DateField()
 
    def born_in_fifties(self):
        return self.birthday.strftime('%Y')[:3] == '195'
    # 關鍵在這裏
    born_in_fifties.boolean = True
 
class PersonAdmin(admin.ModelAdmin):
    # 官方文檔這裏有錯,將'name'改爲'first_name' 
    list_display = ('first_name', 'born_in_fifties')

31、屏蔽界面的添加按鈕

32、xadmin列表頁添加自定義工具欄toolbar

 https://blog.csdn.net/iteye_12715/article/details/82678755

33-想對某些字段設置顏色,可用下面的設置

 
from django.db import models
from django.contrib import admin
from django.utils.html import format_html
 
class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    color_code = models.CharField(max_length=6)
 
    def colored_name(self):
        return format_html(
            '<span style="color: #{};">{} {}</span>',
            self.color_code,
            self.first_name,
            self.last_name,
        )
 
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'colored_name')

 

34、菜單分組管理

https://www.cnblogs.com/fiona-zhong/p/9647986.html

35、增加頁面顯示的列 ‘跳轉’——顯示自定義的html代碼

 
# models.py
 
class Course(models.Model):
    .
    .
    .
    def go_to(self):
        from django.utils.safestring import mark_safe
        #mark_safe後就不會轉義
        return mark_safe("<a href='https://home.cnblogs.com/u/derek1184405959/'>跳轉</a>")
    go_to.short_description = "跳轉"
 
 
# adminx.py
 
class CourseAdmin(object):
    list_display = ['go_to']

 

效果如下:

36、xadmin主頁佈局的修改

例如:

數據庫是 MySQL,xadmin自帶的兩張表:xadmin_usersettings、xadmin_userwidget

xadmin_usersettings:字段value的初始值應爲 | ,代表將主頁面分爲兩列。

xadmin_userwidget:記錄當前登錄用戶主頁面 顯示的小組件。

 xadmin/views/dashboard.py部分源碼

37、設置xadmin新用戶主頁的默認佈局

數據庫:

# xadmin/model.py
 
 
@python_2_unicode_compatible
class UserSettings(models.Model):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"))
    key = models.CharField(_('Settings Key'), max_length=256)
    value = models.TextField(_('Settings Content'))
    
    # 重寫save方法
    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
 
        if not self.value:
            self.value = "|"
            super(UserSettings, self).save()
            page_id = 'home'
            default_list = [
                [{'list': '{"title": "", "model": "auth.user"}'}, ],
                [{'list': '{"title": "", "model": "cashflows.bank_cash_flows"}'}, ],
                [{'html': '{"title": "Test Widget", "content": "第一次測試!!"}'}, ],
                [{'qbutton': '{"title": "aaa"}'}, ],
            ]
            
            for i in default_list:
                user_widget = UserWidget()
                for j in i:
                    for z in j.keys():
                        user_widget.page_id = page_id
                        user_widget.user_id = self.user_id
                        user_widget.widget_type = z
                        user_widget.value = j[z]
                        user_widget.save()
            
            id_list = []  # 存放user的id
            a = UserWidget.objects.filter(user_id=self.user)
            for i in a:
                id_list.append(i.id)
 
            self.value = "%s,%s|%s,%s" % (id_list[0], id_list[1], id_list[2], id_list[3])
            
            UserSettings.objects.filter(user_id=self.user).value = self.value
            super(UserSettings, self).save()
        else:
            super(UserSettings, self).save()

 38、admin_order_field支持查詢查找以按相關模型上的值排序。此示例在列表顯示中包含“作者名字”列,並允許按名字對其進行排序

https://docs.djangoproject.com/en/1.8/ref/contrib/admin/

39、 獲取verbose_name

UserInfo._meta.get_field('name').verbose_name

40、xadmin list_filter 外鍵顯示含有英文,怎麼把英文去掉?

 
# xadmin/plugins/filters.py
 
# 在這個文件裏,第126行
# if len(field_parts) > 1:
#     # Add related model name to title
#     spec.title = "%s %s" % (field_parts[-2].name, spec.title)
 
# 註釋掉!

41、添加自定義的URL

https://www.cnblogs.com/fangsheng/p/9783245.html

42、xadmin多個model的數據渲染在統一個template中

https://www.cnblogs.com/Tommy-Yu/p/5390555.html

 

 

 

 

點擊add widget 會報錯 

把這個boundfield.py裏面的93行這個代碼直接註釋掉就可以了

進入xadmin安裝路徑,編輯C:\Users\administrator\AppData\Local\Programs\Python\Python\Lib\site-packages\django\forms\boundfield.py 第93行註釋掉

或者

查找到 xadmin裏面的 dashboard.py文件內render方法,增加一個rdnderer默認參數是None
一般路徑在 本機虛擬環境\Lib\site-packages\xadmin\views

#render() got an unexpected keyword argument 'renderer'
 #修改bug, 添加renderer
 #by prism 2018/10/4
 def render(self, name, value, attrs=None, renderer=None):

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章