前言
由於比較懶,自己弄了一個用戶驗證,沒有自己寫后台,用了django自帶的user認證,並通過admin直接進行管理,但默認的admin並不漂亮,於是使用了這個django-suit插件,效果對比一下。
我用的是django-1.9.9它的admin是這樣的。老版本的django admin長的更丑。
使用了suit之后的admin是這樣的。
清涼了很多吧,現在開始搞它。
基礎環境
- 我的環境
python: 2.7.10
django: 1.9.9 - 安裝
pip install django-suit # 安裝完畢了
配置部分
-
表結構
使用了自帶的user,由於要添加一個字段,所以做了OneToOneField
models.pyfrom django.db import models from django.contrib.auth.models import User, Group class UserProfile(models.Model): user = models.OneToOneField(User) name = models.CharField(u'姓名', max_length=32, blank=True, null=False) class Meta: verbose_name = u'用戶詳情' verbose_name_plural = u"用戶詳情"
-
settings.py設置
INSTALLED_APPS = [ 'suit', # 添加suit支持 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'web_sso', ] ...... LANGUAGE_CODE = 'zh-Hans' # 設置成中文,老版本django使用'zh_CN' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = False # 注意是False 配合下邊時間格式 USE_TZ = False # 如果只是內部使用的系統,這行建議為false,不然會有時區問題 DATETIME_FORMAT = 'Y-m-d H:i:s' # suit在admin里設置時間的一個小bug。需要把時間格式指定一下 DATE_FORMAT = 'Y-m-d' ...... SUIT_CONFIG = { # suit頁面配置 'ADMIN_NAME': '統一認證平台', #登錄界面提示 'LIST_PER_PAGE': 20, 'MENU': ({'label': u'用戶管理', 'app': 'web_sso', 'models': ('web_sso.MyUser', 'auth.Group', 'web_sso.User_ex')}, #每一個字典表示左側菜單的一欄 # {'label': u'SQL管理', 'app': 'web_sso', 'models': ('web_sso.Sql', 'web_sso.PreSql', 'web_sso.Direction')}, # 可以是多個字典 ), # label表示name,app表示上邊的install的app,models表示用了哪些models }
-
admin.py配置
這里只介紹一些最基礎的admin的配置,詳細可以參考django book的admin部分,后續的定制化admin部分請參考我后邊的博文,將對admin進行較為深度的改造以便較適應復雜的需求。from django.contrib import admin from web_sql import models class UserProfileAdmin(admin.ModelAdmin): list_display = ('user', 'name', 'get_email', 'get_is_active') # 定義admin總覽里每行的顯示信息,由於email是在userprofile的外鍵user表中,所以需要特殊返回,注意這個字段不能用user__email的形式 search_fields = ('user__username', 'name') # 定義搜索框以哪些字段可以搜索,因為username是在user表中,所以用user__username的形式,這里需要注意下,不能直接用user表名,要用字段名,表名__字段名 list_filter = ('user__groups', 'user__is_active') #傳入的需要是列表,設定過濾列表 def get_email(self, obj): # 定義這個函數是由於email是在userprofile表的外鍵表user里,所以需要單獨return一下 return obj.user.email get_email.short_description = 'Email' #list展示時候顯示的title get_email.admin_order_field = 'user__email' #指定排序字段 def get_is_active(self, obj): return obj.user.is_active get_is_active.short_description = '有效' get_is_active.admin_order_field = 'user__is_active' admin.site.register(models.UserProfile, UserProfileAdmin) # 引用的固定格式,注冊的model和對應的Admin,Admin放在后邊,同樣還有noregister方法:比如admin.site.noregister(Group),把group這個表在admin中去掉(默認user和group都是注冊到admin中的)
-
其他admin小技巧,admin自定義js或css,以實現一些自己想要的效果
admin.py
class DirectionAdmin(admin.ModelAdmin): list_display = ('describe', 'db_name') class Media: js = ('js/my_own_admin.js',) css = { 'all': ('css/admin/my_own_admin.css',) } admin.site.register(models.Direction, DirectionAdmin) # 然后把對應的js或css文件寫入到static下邊的指定文件里吧,運行admin的頁面會額外引用你自己的css和js文件
-
效果展示如下
結語
先寫到這里,其實除了美化,admin還可以做很多事情,但是由於都在django的源碼里,可定制化不如自己寫的后台那么靈活,但也是可以定制的,定制的方法,請參考我后邊的文章。Django admin定制化,User字段擴展[原創]