I考抄、Admin界面顯示優(yōu)化
Ein.內(nèi)置優(yōu)化
由于用戶表比較特殊,為系統(tǒng)中存在的,Django內(nèi)置了一個UserAdmin對顯示用戶信息做了優(yōu)化
我們在apps/users/admin.py內(nèi)重寫所有代碼
# 導(dǎo)入UserAdmin
from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
from apps.users.models import UserProfile
admin.site.register(UserProfile, UserAdmin)
啟動項目,進入http://127.0.0.1:8000/admin/ 觀察用戶信息界面的變化
Zwei.利用Xadmin優(yōu)化
a.安裝xadmin
接下來我們使用xadmin對用戶信息界面進行優(yōu)化(對應(yīng)的Django2.2版本的xadmin,注:不同版本的Django需要在Github上下載對應(yīng)版本的xadmin)下載鏈接 (百度云提取碼:6fm7)
首先我們打開將xadmin下載并解壓后粘貼到項目根目錄內(nèi)韩玩,然后打開xadmin/xadmin的配置.txt閱讀內(nèi)容
1. 下載xadmin源碼
2. 在settings的INSTALLED_APPS中添加
crispy_forms 和 xadmin
3. 安裝xadmin的依賴包
4. 通過migrate生成xadmin需要的表
我們按步驟進行,由于我們已經(jīng)完成了下載陆馁,所以進行第二步找颓,打開settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.users.apps.MxOnlineConfig',
'apps.courses.apps.CoursesConfig',
'crispy_forms',
# 注冊xadmin
'xadmin',
]
按照第三步,我們打開xadmin/requirements.txt叮贩,利用pip install -r requirements.txt進行安裝依賴(一個個安裝也沒有問題)击狮。
注意當(dāng)前我們使用的python版本為3.7。
按照第四步益老,我們進行數(shù)據(jù)遷移打開manage.py Task
migrate xadmin
此時可能會報錯內(nèi)容為:ImportError: No module named ‘DjangoUeditor’彪蓬,我們安裝DjangoUeditor包,重新migrate捺萌,繼續(xù)報錯ImportError: No module named ‘widgets’档冬,這是由于DjangoUeditor對python3的支持存在問題,我們需下載一個新的DjangoUeditor下載鏈接(百度云提取碼:ju2n)桃纯,解壓新下載的DjangoUeditor酷誓,復(fù)制該文件夾,找到自己虛擬環(huán)境的創(chuàng)建的位置我的為E:\PythonVenv\py_mxonline\Lib\site-packages慈参,粘貼進該文件夾呛牲,并替換重復(fù)文件即可解決問題。(這是其中一種常見錯誤驮配,其余錯誤請自行搜索解決)
解決該問題后我們重新migrate xadmin(不需要makemigrations的原因是xadmin內(nèi)已經(jīng)生成完遷移文件了。)
之后在MxOnline/urls.py內(nèi)給xadmin分配url
# 導(dǎo)入xadmin
import xadmin
# 在urlpatterns內(nèi)添加
path('xadmin/', xadmin.site.urls),
這里介紹一種問題的解決辦法
問題:已經(jīng)遷移過數(shù)據(jù),重新遷移時無法刷新表或在遷移內(nèi)有錯需要重新對部分應(yīng)用進行遷移解決辦法:
1.打開對應(yīng)數(shù)據(jù)庫壮锻,刪除django_migrations表以及需要重新遷移生成的表琐旁。
2.刪除對應(yīng)應(yīng)用已存在的遷移文件
3.打開manage.py Task 輸入 migrate --fake(該語句會生成并刷新django_migrations表)
4.對需要重新遷移的應(yīng)用進行makemigrations [appname] 后直接 migrate [appname] 即可
b.應(yīng)用xadmin
這里以courses應(yīng)用舉例說明如何應(yīng)用,請讀者根據(jù)文末提示自行完成organizations應(yīng)用的xadmin優(yōu)化
首先打開apps/courses/models.py猜绣,我們先編寫模型:
from django.db import models
from apps.users.models import BaseModel
# Create your models here.
class Course(BaseModel):
name = models.CharField(verbose_name="課程名", max_length=50)
desc = models.CharField(verbose_name="課程描述", max_length=300)
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時長/min")
degree = models.CharField(verbose_name="課程難度",
choices=(('primary', '初級'), ('intermediate', '中級'), ('advanced', '高級')), max_length=20)
students = models.IntegerField(verbose_name="學(xué)習(xí)人數(shù)", default=0)
fav_nums = models.IntegerField(verbose_name="收藏人數(shù)", default=0)
click_nums = models.IntegerField(verbose_name="點擊量", default=0)
notice = models.CharField(verbose_name="課程公告", max_length=300, default="")
category = models.CharField(verbose_name="課程類別", max_length=20, default="后端開發(fā)")
tag = models.CharField(verbose_name="標(biāo)簽", max_length=10, default="")
course_notes = models.CharField(verbose_name="課程須知", max_length=300, default="")
teacher_notice = models.CharField(verbose_name="教師通告", max_length=300, default="")
is_classic = models.BooleanField(default=False, verbose_name="是否經(jīng)典")
is_banner = models.BooleanField(default=False, verbose_name="是否廣告位")
course_image = models.ImageField(upload_to="courses/%Y/%m", verbose_name="封面", max_length=100)
class Meta:
verbose_name = "課程信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Lesson(BaseModel):
# on_delete 表示對應(yīng)的外鍵數(shù)據(jù)被刪除后當(dāng)前數(shù)據(jù)如何執(zhí)行
course = models.ForeignKey(Course, verbose_name="課程", on_delete=models.CASCADE)
chapter_name = models.CharField(verbose_name="章節(jié)名", max_length=100)
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時長/min")
class Meta:
verbose_name = "課程章節(jié)"
verbose_name_plural = verbose_name
def __str__(self):
return self.chapter_name
class Video(BaseModel):
lesson = models.ForeignKey(Lesson, verbose_name="章節(jié)", on_delete=models.CASCADE)
video_name = models.CharField(max_length=100, verbose_name="視頻名稱")
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時長/min")
url = models.CharField(max_length=1000, verbose_name="訪問地址")
class Meta:
verbose_name = "課程章節(jié)"
verbose_name_plural = verbose_name
def __str__(self):
return self.video_name
class CourseResource(BaseModel):
course = models.ForeignKey(Course, verbose_name="課程", on_delete=models.CASCADE)
resource_name = models.CharField(max_length=100, verbose_name="名稱")
file_url = models.FileField(max_length=200, verbose_name="下載地址", upload_to="courses/resourse%Y/%m")
class Meta:
verbose_name = "課程資源"
verbose_name_plural = verbose_name
def __str__(self):
return self.resource_name
然后灰殴,對courses應(yīng)用進行數(shù)據(jù)遷移
遷移完成后,在apps/courses文件夾下新建一個名為adminx.py的文件(注:文件名不可變)掰邢,編寫顯示邏輯
import xadmin
from apps.courses.models import Course
# Register your models here.
# 無需繼承admin.ModelAdmin
class CourseAdmin(object):
# 顯示字段
list_display = ["id", "name", "desc", "learn_times", "degree"]
# 搜索字段
search_fields = ["name"]
# 過濾器
list_filter = ["id", "name", "desc", "learn_times", "degree"]
xadmin.site.register(Course, CourseAdmin)
補充apps/courses/apps.py內(nèi)容
from django.apps import AppConfig
class CoursesConfig(AppConfig):
name = 'apps.courses'
# 補充的代碼牺陶,為了顯示的直觀
verbose_name = "課程管理"
然后我們運行項目,在http://127.0.0.1:8000/xadmin/ 內(nèi)打開xadmin頁面
點擊課程信息辣之,我們可以添加課程
II掰伸、實現(xiàn)organizations應(yīng)用的xadmin顯示優(yōu)化的若干提示
下面是organizations應(yīng)用models內(nèi)容的相應(yīng)提示,請按照下列類以及屬性提示編寫model層
Class | Attributes(verbose_name) | Remarks |
---|---|---|
City | --- | Meta:城市信息 |
^ | 城市名 | |
^ | 城市描述 | --- |
CourseOrg | --- | Meta:機構(gòu)信息 |
^ | 機構(gòu)名稱 | --- |
^ | 機構(gòu)標(biāo)簽 | --- |
^ | 機構(gòu)類別 | 用choice實現(xiàn)類別:個人怀估,高校狮鸭,培訓(xùn)機構(gòu)三個選項 |
^ | 點擊量 | --- |
^ | 收藏人數(shù) | --- |
^ | logo | 圖片的加載路徑"org/%Y/%m" |
^ | 機構(gòu)地址 | --- |
^ | 學(xué)習(xí)人數(shù) | --- |
^ | 課程數(shù) | --- |
^ | 是否認(rèn)證 | --- |
^ | 是否金牌 | --- |
^ | 所在城市 | 需要外鍵關(guān)聯(lián)City類 |
Teacher | --- | Meta:教師信息 |
^ | 用戶 | 一對一關(guān)聯(lián)UserProfile |
^ | 所屬機構(gòu) | 外鍵關(guān)聯(lián)CourseOrg |
^ | 教師名 | --- |
^ | 工作年限 | --- |
^ | 就職公司 | --- |
^ | 公司職位 | --- |
^ | 教學(xué)特點 | --- |
^ | 收藏人數(shù) | --- |
^ | 點擊量 | --- |
^ | 年齡 | --- |
^ | 頭像 | 圖片的加載路徑"teacher/%Y/%m" |
以及對于運行結(jié)果的示例如下:
為了完成下列顯示,我們也需要編寫對應(yīng)的apps.py和adminx.py來完成顯示
在此之前多搀,我們需要完備的熟悉courses示例
該項目已在github基本完成大體內(nèi)容歧蕉,還有些細(xì)枝末節(jié)的內(nèi)容未實現(xiàn),以及由于時間原因康铭,django的筆記暫停更新惯退,之后會整理后進行接續(xù)