1. 程式人生 > >django 1.11.16 +Python3.6 + xadmin 的坑

django 1.11.16 +Python3.6 + xadmin 的坑

1、首先安裝就會有一個坑,很多教程的安裝是直接在虛擬環境下使用 pip install xadmin 或者 pip install django-xadmin

事實證明 Django2+xadmin2的版本是行不通的, 正確方法是通過官方的github https://github.com/sshwsfc/xadmin
    
若使用 pip install xadmin可能會報如下錯誤, 說是由於README.rst這個檔案的編碼有問題,其內容也只是安裝的介紹,解決方法是

1)訪問xadmin 的 github下載其壓縮包zip,然後解壓

   2 ) 直接在虛擬環境下執行 pip install <壓縮包路徑> 如:pip install xadmin.zip

4 ) 此時xadmin及其依賴包被下載到 虛擬環境下

2. 安裝方法二:

pip install git+git://github.com/sshwsfc/xadmin.git
      或者
    pip install git+git://github.com/sshwsfc/[email protected]
    以上兩種方法只是面對的Django版本不同, 可自行選擇。

該方法可以將xadmin和其依賴包直接安裝虛擬環境下
   3. 安裝方法三:

1)同樣使用git clone 或者下載zip壓縮包的方式將原始碼下載到本地
     2 ) 拿到根目錄下的xadmin, 存放在 extra_apps(自定義)目錄下,作為第三方依賴的存放目錄

3 ) 將extra_apps目錄設定為 Resource Root,右鍵 Mark Directory as -> Resource Root

二、配置

無論使用哪一種安裝方式, 接下配置並且migrate的順序很重要,否則可能會引發一系列的報錯, 以下先使用方法二安裝好依賴, 再使用安裝方法三引入xadmin。

1 ) 使用 pip list 可以檢視依賴包, 使用方法一和二安裝時自動安裝,如果直接使用方法三安裝依賴參考github,但比較麻煩。

2 ) 此處是使用 pip install git+git://github.com/sshwsfc/[email protected]

, 可以同時安裝依賴包, 然後將虛擬環境下的xadmin解除安裝 pip uninstall xadmin , 再使用方法三extra_apps方式引入xadmin原始碼。

3 ) settings.py中新增應用

將extra_apps的新增至python專案的搜尋目錄

sys.path.insert(0, os.path.join(BASE_DIR, ‘extra_apps’))

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘xadmin’,
‘crispy_forms’, // 相關依賴
‘reversion’    // 相關依賴
]
from django.contrib import admin // 原來模板模組
from django.urls import path
import xadmin // 匯入xadmin模組

urlpatterns = [
# path(‘admin/’, admin.site.urls),
path(‘xadmin/’, xadmin.site.urls), // 修改路由
]
5 ) 此時執行專案是無法開啟後臺登入頁的。 還需要進行資料遷移建立相應的表
python manage.py makemigrations
python manage.py migrate

該錯誤有可能發生,原因是資料庫儲存索引欄位做大限制, 本例是因為已經建立多個數據表,總和超過了1000導致報錯,解決辦法是分別將每個應用的模型做資料遷移。避免一次性超過限制大小而報錯。當然,在後面使用正確順序操作時也可以解決。

此時瀏覽器執行 localhost:8000/xadmin/ 報錯如下:該錯誤是由於以上錯誤中斷了django_session資料表的建立

三、重新進行資料遷移操作(避免出現以上錯誤: django.db.utils.InternalError: (1071) 和 django_session)

1 ) 將之前 setings.py和urls.py 新增的程式碼先註釋 , 同時將資料庫(MySQL)中對應的資料表刪除

INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
     'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      # 'xadmin',
      # 'crispy_forms',
     # 'reversion'
 ]
複製程式碼
複製程式碼
from django.contrib import admin
from django.urls import path
import xadmin

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('xadmin/', xadmin.site.urls),
]

2 ) 暫時使用官方的後臺模板,建立資料遷移表並生成資料, 此時是官方配置,故無相容性問題,在資料庫中也生成對應的資料表。

建立管理員賬號 createsuperuser, 按提示輸入賬號密碼即可, 然後再瀏覽器訪問後臺 localhost:8000/admin 登入即可。

此時檢視資料庫可以看到有django_session資料表

兩段程式碼中可看到

‘django.contrib.sessions.middleware.SessionMiddleware’,
‘django.contrib.sessions’,
預設配置中使用session作為後臺資料儲存 ,故django_session資料表也是必須的,否則報錯。
複製程式碼
1 MIDDLEWARE = [
2 ‘django.middleware.security.SecurityMiddleware’,
3 ‘django.contrib.sessions.middleware.SessionMiddleware’,
4 ‘django.middleware.common.CommonMiddleware’,
5 ‘django.middleware.csrf.CsrfViewMiddleware’,
6 ‘django.contrib.auth.middleware.AuthenticationMiddleware’,
7 ‘django.contrib.messages.middleware.MessageMiddleware’,
8 ‘django.middleware.clickjacking.XFrameOptionsMiddleware’,
9 ]
10
11 INSTALLED_APPS = [
12 ‘django.contrib.admin’,
13 ‘django.contrib.auth’,
14 ‘django.contrib.contenttypes’,
15 ‘django.contrib.sessions’,
16 ‘django.contrib.messages’,
17 ‘django.contrib.staticfiles’,
18 # ‘xadmin’,
19 # ‘crispy_forms’,
20 # ‘reversion’
21 ]
複製程式碼

3 ) 去掉之前對xadmin相關配置的註釋 , 此時瀏覽器訪問 localhost:8000/xadmin/ 無法登入後臺, 提示相關表不存在,需要進行資料遷移操作生成資料表。

但切記,不可刪除之前生成的資料表,否則將出現無法建立django_session表的情況 , 並且如果之後需要新增資料表,儘量不要批量進行資料遷移操作, 而是分開單個應用進行資料遷移操作。

開啟manage.py命令, 建立成功, 在資料庫中可檢視到xadmin_字首的資料表。

此時重啟專案並瀏覽器登入後臺localhost:8000/xadmin , 輸入賬號密碼, 大功告成…

四、後臺顯示資料表

在應用中建立 adminx.py必須是adminx.py, 代替了原來的 admin.py

   前提是已經設計好UserProfie模型。

複製程式碼
import xadmin
from .models import UserProfile, Comments

Register your models here.

class UserProfileAdmin(object):
list_display = [‘username’, ‘password’,
‘email’, ‘nick_name’, ‘birth_date’, ‘gender’, ‘telephone’,
‘address’, ‘avatar’, ‘date_joined’]
search_fields = [‘nick_name’]
list_filter = [‘gender’]

class CommentsAdmin(object):
list_display = [‘title’, ‘content’, ‘type’, ‘add_time’]
search_fields = [‘title’]
list_filter = [‘type’]

xadmin.site.register(UserProfile, UserProfileAdmin)
xadmin.site.register(Comments, CommentsAdmin)
複製程式碼

再次訪問,報錯如下。 需要先登出 UserProfile後再次註冊 ,修改程式碼如下

1 xadmin.site.unregister(UserProfile)
2 xadmin.site.register(UserProfile, UserProfileAdmin)

重啟專案,訪問後臺如下, 大功告成…

另外可能出現的錯誤:

  1. ImportError: cannot import name ‘login’ : 出現這個錯誤應該是一開始就安裝了django2.1, 該版本還不能完全相容xadmin2.0, 解決方法是降級為django2.0版本
  2. 1146, “Table ‘mtapp.xadmin_usersettings’ doesn’t exist” : 出現該錯誤是因為還沒有進行資料遷移操作
    分類: Python