django2.0 以上版本安裝 xadmin
1.xadmin的下載
源碼包下載地址:
https://github.com/sshwsfc/xadmin/tree/django2
2.使用命令安裝xadmin
pip install 你下載的壓縮包的位置
不用解壓,直接使用pip或者pip3 install 壓縮包 路徑進行安裝
安裝完成后,因為xadmin有自己的模型管理類,需要遷移
由於安裝時xadmin已經執行過 makemigrations
所以直接使用 migrate進行遷移就行了
其他辦法
第一步安裝xadmin-django2
https://github.com/sshwsfc/xadmin/tree/django2 下載xadmin-django2文件
python setup.py install
安裝依賴pip install -r requirements.txt
第二步setting配置xadmin
INSTALLED_APPS = [
'xadmin', # 添加
'crispy_forms', # 添加
'reversion', # 添加(可選)
]
第三步urls.py配置,xadmin替換admin
1 2 3 4 5 6 7 8 |
|
數據庫同步
1 2 |
|
- 訪問首頁
源碼安裝部署
下載:https://github.com/sshwsfc/xadmin
解壓xadmin-master.zip文件,將xadmin-master文件中xadmin目錄復制到自己的django項目下
xadmin注冊
已在models創建表EmailVerifyRecord
1 2 3 4 5 6 7 8 9 |
|
在創建的app下創建adminx.py文件
1 2 3 4 5 6 7 8 9 |
|
主題應用
adminx.py文件增加
1 2 3 4 5 6 7 |
|
全局應用
- 頁頭和頁尾自定義
adminx.py文件增加
1 2 3 4 5 6 7 |
|
- 左側app中文名稱定義和多表緊縮
adminx.py文件增加
1 2 3 4 5 6 7 8 |
|
apps.py文件
1 2 3 4 5 6 7 |
|
__init__.py文件
1 |
|
font awesome自定義
下載后覆蓋xadmin目錄下css、fonts目錄
在adminx.py文件中引入model_icon
1 2 3 4 5 6 7 |
|
model_icon這個值,在http://fontawesome.io/icons/ 中選中的圖標或class內容,如下圖
引用自定義的用戶信息
如上圖目錄中xadmin源碼中加入下面內容
1 2 |
|
修改密碼,需要更改源碼
actions制作案例
adminx.py文件內容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
提示:可以參考BaseActionView中的刪除DeleteSelectedAction,可以實現xadmin自帶的日志記錄。用於審計操作者的操作內容。
xadmin可以使用的頁面樣式控制基本與Django原生的admin一致。list_display 控制列表展示的字段
search_fields 控制可以通過搜索框搜索的字段名稱,xadmin使用的是模糊查詢
list_filter 可以進行過濾操作的列
ordering 默認排序的字段
readonly_fields 在編輯頁面的只讀字段
exclude 在編輯頁面隱藏的字段
list_editable 在列表頁可以快速直接編輯的字段
show_detail_fileds 在列表頁提供快速顯示詳情信息
refresh_times 指定列表頁的定時刷新
list_export 控制列表頁導出數據的可選格式
show_bookmarks 控制是否顯示書簽功能
data_charts 控制顯示圖標的樣式
model_icon 控制菜單的圖標
model_icon 菜單圖標
model_icon 參考http://fontawesome.dashgame.com/
效果圖
style_fields
控制字段的顯示樣式
默認manytomany字段樣式是個單排下拉框,對添加選項操作十分不友好
level是我model中的一個多對多字段
m2m_transfer就是多對多穿梭框樣式
ueditor是支持富文本編輯
filter_horizontal是多對多樣式字段支持過濾
list_display
指定xadmin中需要顯示哪些字段信息,以列表顯示
list_display = ('first_name', 'last_name', 'email')
search_fields
指定哪些字段信息可以被搜索
search_fields = ('first_name', 'last_name')
list_filter
添加哪些字段需要進行過濾顯示(添加過濾器)
list_filter = ('publication_date',) #添加過濾(這里是過濾日期)
date_hierarchy
添加日期過濾器,該字段只能是日期類型
date_hierarchy = 'publication_date' #過濾(日期的另外一種過濾方式,可以添加后看一下)
ordering
顯示的列表以什么進行排序 ,加‘-’表示降序
ordering = ('-publication_date',) #排序(這里以日期排序,加‘-’表示降序)
fields
排除一些不想被其他人編輯的fields,不包含在內的字段不能編輯
fields = ('title', 'authors', 'publisher')
filter_horizontal
從‘多選框’的形式改變為‘過濾器’的方式,水平排列過濾器,必須是一個 ManyToManyField類型,且不能用於 ForeignKey字段,默認地,管理工具使用下拉框 來展現外鍵 字段
filter_horizontal = ('authors',)
raw_id_fields
將ForeignKey字段從‘下拉框’改變為‘文本框’顯示
raw_id_fields = ('publisher',)
list_editable
列表顯示的時候,指定的字段可以直接頁面一鍵編輯
list_editable = ['csdevice']
readonly_fields
指定一些字段為只讀,不可修改
readonly_fields = ('cservice',)
exclude
在編輯和查看列表時指定不顯示的字段
exclude = ['cservice']
refresh_times
后台可選擇10秒刷新一次或者60秒刷新一次如下
refresh_times = [10, 60]
show_detail_fields
在指定的字段后添加一個顯示數據詳情的一個按鈕
show_detail_fields=['ttdsn']
relfield_style
后台自定義不是下拉選擇框,而是搜索框(解決了為什么用戶不是下拉框的問題。。)
relfield_style = 'fk-ajax'
8.圖表
在數據列表頁面,根據列表數據生成圖表,可以指定多個數據列,生成多個圖表。
在Model OptionClass 中設定data_charts屬性,該屬性為dict類型,key是圖表的標示名稱,value是圖表的具體設置屬性,示例:
data_charts = {
"user_count": {'title': u"User Register Raise", "x-field": "year", "y-field": ("cn",),
"order": ('year',)},
# "avg_count": {'title': u"Avg Report", "x-field": "date", "y-field": ('avg_count',), "order": ('date',)}
}
圖表的主要屬性為:
title : 圖表的顯示名稱
x-field : 圖表的 X 軸數據列, 一般是日期, 時間等
y-field : 圖表的 Y 軸數據列, 該項是一個 list, 可以同時設定多個列, 這樣多個列的數據會在同一個圖表中顯示
order : 排序信息, 如果不寫則使用數據列表的排序
效果:
9.數據導出
如果想要導出Excel數據,需要安裝xlwt。
默認情況下,xadmin會提供Excel,CSV,XML,json四種格式的數據導出,可以通過設置OptionClass的list_export屬性來指定使用哪些導出格式(四種格式分別用xls,csv,xml,json表示)或是將list_export設置為None來禁用數據導出功能。
10.過濾
在 Model OptionClass 中設置以下屬性:
list_filter 屬性:
該屬性指定可以過濾的列的名字, 系統會自動生成搜索器
search_fields 屬性:
屬性指定可以通過搜索框搜索的數據列的名字, 搜索框搜索使用的是模糊查找的方式, 一般用來搜素名字等字符串字段
free_query_filter 屬性:
默認為 True , 指定是否可以自由搜索. 如果開啟自由搜索, 用戶可以通過 url 參數來進行特定的搜索, 例如:
http://xxx.com/xadmin/auth/user/?name__contains=tony
11. 設置只讀字段
在使用xadmin的時候,ModelAdmin默認只有對於model的增刪改查,但是總是有些字段是不希望用戶來編輯的。而 readonly_fields 設置之后不管是admin還是其他用戶都會變成只讀,而我們通常只是想限制普通用戶。 這時我們就可以通過重寫 get_readonly_fields 方法來實現對特定用戶的只讀顯示。
class UserInfoAdmin():
def get_readonly_fields(self):
""" 重新定義此函數,限制普通用戶所能修改的字段 """
if self.user.is_superuser:
self.readonly_fields = []
return self.readonly_fields
readonly_fields = ('user_email',)
效果:
普通用戶:
admin:
Django xadmin圖片上傳與縮略圖處理
用
python django
開發時,個人選中Xadmin后台管理系統框架,因為它*內置功能豐富, 不僅提供了基本的CRUD功能,還內置了豐富的插件功能。包括數據導出、書簽、圖表、數據添加向導及圖片相冊等多種擴展功能。但是上傳圖片時想實現圖片文件重命名並生成圖片預覽圖時,從網上找了一些大牛寫的代碼,在自己的項目中出錯,所以自己摸索找到使用django-stdimage
(參考官方文檔)生成預覽圖+圖片重命名的解決辦法,代碼如下:
step 1. 安裝
$pip install django-stdimage==3.2.0 -i "https://pypi.doubanio.com/simple/"
step 2. 配置settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'stdimage', #記得一定要添加進入
]
step 3. 配置models.py
from datetime import datetime
from stdimage.models import StdImageField
from stdimage.utils import UploadToUUID
class Banner(models.Model):
title = models.CharField(max_length=100, verbose_name=u"標題")
image = StdImageField(max_length=100,
upload_to=UploadToUUID(path=datetime.now().strftime('banner/%Y/%m')),
verbose_name=u"輪播圖",
variations={'thumbnail': {'width': 100, 'height': 75}})
url = models.CharField(max_length=100, verbose_name=u"訪問地址")
index = models.IntegerField(default=100, verbose_name=u"順序")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加時間")
class Meta:
verbose_name = u"輪播圖"
verbose_name_plural = verbose_name
def image_img(self):
if self.image:
return str('<img src="%s" />' % self.image.thumbnail.url)
else:
return u'上傳圖片'
image_img.short_description = '輪播圖'
image_img.allow_tags = True
def __str__(self):
return '{0}(位於第{1}位)'.format(self.title, self.index)
step 4. 配置adminx.py
class BannerAdmin(object):
#顯示不要用image,而應該用image_img
list_display = ['title', 'image_img', 'url', 'index', 'add_time']
search_fields = ['title', 'url', 'index']
list_filter = ['title', 'url', 'index', 'add_time']
#注冊輪播圖
xadmin.site.register(Banner, BannerAdmin)
step 5. 配置urls.py
from django.urls import path, re_path
from django.views.static import serve
import xadmin
from Aiword.settings import MEDIA_ROOT
urlpatterns = [
path('xadmin/', xadmin.site.urls),
# 處理圖片顯示的url,使用Django自帶serve,
# 傳入參數告訴它去哪個路徑找,我們有配置好的路徑MEDIAROOT
re_path('media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),
]
效果圖片:
效果 圖一
效果 圖二
官方文檔說明:
默認情況下,StdImageField 存儲圖像而不修改文件名。
如果您想使用更一致的文件名,可以使用內置的上傳調用
比如:
from stdimage.utils import UploadToUUID, UploadToClassNameDir, \
UploadToAutoSlug,UploadToAutoSlugClassNameDir
class MyClass(models.Model):
title = models.CharField(max_length=50)
# 文件保存到 MEDIA_ROOT/myclass/#FILENAME#.#EXT#
image1 = StdImageField(upload_to=UploadToClassNameDir())
# 文件上傳時文件名自定義后保存到 MEDIA_ROOT/myclass/pic.#EXT#
image2 = StdImageField(upload_to=UploadToClassNameDir(name='pic'))
# 文件名自動uuid重命名上傳到-> MEDIA_ROOT/images/#UUID#.#EXT#
image3 = StdImageField(upload_to=UploadToUUID(path='images'))
# 文件根據uuid規則進行文件重命名並上傳到 MEDIA_ROOT/myclass/#UUID#.#EXT#
image4 = StdImageField(upload_to=UploadToClassNameDirUUID())
# 文件保存到 MEDIA_ROOT/images/#SLUG#.#EXT#
image5 = StdImageField(upload_to=UploadToAutoSlug(populate_from='title'))
# 文件保存到 MEDIA_ROOT/myclass/#SLUG#.#EXT#
image6 =StdImageField(
upload_to=UploadToAutoSlugClassNameDir(populate_from='title'))
參考: http://xadmin.readthedocs.io/en/docs-chinese/plugins.html