增加用戶
1)打開在上次筆記中創(chuàng)建的頁面
http://127.0.0.1:8000/admin/
然后新建組時(shí)會(huì)有一個(gè)錯(cuò)誤胶哲,需要在MXOline/settings文件里的DATABASES內(nèi)添加以下代碼:
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
}
2)建立一個(gè)組
3)增加一個(gè)用戶
xadmin
xadmin是對(duì)admin的擴(kuò)展份企,讓我們的后臺(tái)管理更加便捷
- 下載xadmin壓縮包可以到https://github.com/sshwsfc/xadmin 這個(gè)網(wǎng)址下載~
-
將壓縮包解壓以后復(fù)制到項(xiàng)目的根目錄下:
打開xadmin/xadmin的配置文件,根據(jù)這個(gè)提示操作進(jìn)行配置
- 打開MXOline/settings.py文件弓熏,注冊(cè)這兩個(gè)
'crispy_forms',
'xadmin.apps.XAdminConfig',
-
打開xadmin/requirements.txt,這里他需要安裝的所有依賴
- 進(jìn)入到admin目錄下安裝依賴
cd xadmin
pip install -r requirements.txt
-
通過migrate生成xadmin需要的表
注意這里不用makemigrations,因?yàn)樗约阂呀?jīng)生產(chǎn)了這個(gè)文件了
直接migrate僻爽,這里報(bào)錯(cuò)了
先安裝一下,發(fā)現(xiàn)依然會(huì)報(bào)錯(cuò)富岳,這樣需要到GitHub上找到支持python3的這個(gè)包
下載后先將壓縮包解壓谨垃,找到你創(chuàng)建的虛擬環(huán)境下的MXOline\venv\Lib\site-packages目錄下,里面應(yīng)該會(huì)有一個(gè)同名字的文件夾墓拜,將壓縮包中的文件夾替換掉港柜,這樣的話這個(gè)錯(cuò)誤就會(huì)解決。
然后讓執(zhí)行遷移命令:
migrate xadmin
-
刷新數(shù)據(jù)庫(kù)
配置路由咳榜,打開MXOline/urls.py文件
import xadmin
urlpatterns = [
path('admin/', admin.site.urls),
path('xadmin/', xadmin.site.urls),
]
- 運(yùn)行一下:http://127.0.0.1:8000/xadmin/
表設(shè)計(jì)
1.創(chuàng)建app
- 創(chuàng)建機(jī)構(gòu)相關(guān)app
startapp oragnizations
- 創(chuàng)建管理機(jī)構(gòu)相關(guān)app
startapp operations
2.注冊(cè)app
- 打開MXOline/settings.py文件
'organizations.apps.OrganizationsConfig',
'operations.apps.OperationsConfig',
-
將這兩個(gè)新注冊(cè)的app轉(zhuǎn)移到apps文件夾下
3.填寫模型類
- 打開apps/courses/models.py文件
from django.db import models
# Create your models here.
from apps.users.models import BaseModel
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í)時(shí)長(zhǎng)(分鐘數(shù))")
degree = models.CharField(verbose_name="難度", choices=(("cj","初級(jí)"),("zj","中級(jí)"),("gj","高級(jí)")),max_length=2)
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="點(diǎn)擊數(shù)", 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="")
youneed_know = models.CharField(verbose_name="課程須知", max_length=300, default="")
teacher_tell = models.CharField(verbose_name="老師告訴你", max_length=300, default="")
is_classics = models.BooleanField(default=False,verbose_name="是否經(jīng)典")
is_banner = models.BooleanField(default=False,verbose_name="是否廣告位")
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表示對(duì)應(yīng)的外鍵數(shù)據(jù) 把被刪除后夏醉, 當(dāng)前數(shù)據(jù)怎么辦
course = models.ForeignKey(Course, verbose_name="課程", on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name="章節(jié)名")
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時(shí)長(zhǎng)(分鐘數(shù))")
class Meta:
verbose_name = "課程章節(jié)"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Video(BaseModel):
lesson = models.ForeignKey(Lesson,verbose_name="章節(jié)", on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name="視頻名")
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時(shí)長(zhǎng)(分鐘數(shù))")
url = models.CharField(max_length=1000, verbose_name="訪問地址")
class Meta:
verbose_name = "視頻"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseResource(BaseModel):
course = models.ForeignKey(Course, verbose_name="課程", on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name="名稱")
file = 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.name
- 遷移數(shù)據(jù)庫(kù)
makemigrations
migrate
-
刷新數(shù)據(jù)庫(kù)
五.注冊(cè)xadmin(另一種方式)
-
我們?cè)赼pps/courses目錄下新建一個(gè)python file文件 名字叫做adminx(一定要叫這個(gè)!涌韩!)
打開apps/courses/adminx.py文件
import xadmin
from apps.courses.models import Course
# 不用繼承admin.ModelAdmin畔柔,
class CourseAdmin(object):
pass
xadmin.site.register(Course, CourseAdmin)
- 打開apps/courses/apps.py文件
verbose_name = "課程管理"
-
刷新網(wǎng)頁,出現(xiàn)了課程信息(如果沒出現(xiàn)那就關(guān)掉服務(wù)重啟服務(wù))
-
添加課程
打開apps/courses/adminx.py文件
import xadmin
from apps.courses.models import Course
# 不用繼承admin.ModelAdmin臣樱,
class CourseAdmin(object):
# 顯示字典
list_display = ["id", "name", "desc","learn_times", "degree"]
# 搜索字段
search_fields = ["name", "desc"]
list_filter = ["id", "name", "desc","learn_times", "degree"]
xadmin.site.register(Course, CourseAdmin)
刷新頁面出現(xiàn)過濾器
添加機(jī)構(gòu)信息
- 在apps/oragnizations/models.py文件中:
from django.db import models
# Create your models here.
from apps.users.models import BaseModel
from apps.users.models import UserProfile
class City(BaseModel):
name = models.CharField(verbose_name="城市名",max_length=20)
descirption = models.CharField(verbose_name="描述",max_length=200)
class Meta:
verbose_name = "城市信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseOrg(BaseModel):
city = models.ForeignKey(City, verbose_name="所在城市", on_delete=models.CASCADE)
name = models.CharField(verbose_name="機(jī)構(gòu)名稱",max_length=20)
tag = models.CharField(verbose_name="機(jī)構(gòu)標(biāo)簽",max_length=20,default="")
category = models.CharField(verbose_name="機(jī)構(gòu)類別", max_length=20, default="")
org = models.CharField(verbose_name="培訓(xùn)機(jī)構(gòu)", choices=(('gr', "個(gè)人"), ('gx', "高校")), max_length=2)
click_nums = models.IntegerField(verbose_name="點(diǎn)擊人數(shù)", default=0)
fav_nums = models.IntegerField(verbose_name="收藏人數(shù)", default=0)
image = models.ImageField(upload_to="org/%Y/%m", verbose_name="logo", max_length=100)
address = models.CharField(verbose_name="機(jī)構(gòu)地址", max_length=50)
student = models.IntegerField(verbose_name="學(xué)習(xí)人數(shù)", default=0)
lesson_nums = models.IntegerField(verbose_name="課程數(shù)",default=0)
attestation = models.BooleanField(default=False, verbose_name="是否認(rèn)證")
gold = models.BooleanField(default=False, verbose_name="是否金牌")
class Meta:
verbose_name = "機(jī)構(gòu)信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Teacher(BaseModel):
user = models.OneToOneField(UserProfile, verbose_name="用戶", on_delete=models.SET_NULL, null=True, blank=True)
org_name = models.CharField(verbose_name="所屬機(jī)構(gòu)", max_length=20)
name = models.CharField(verbose_name="教師姓名", max_length=10)
years = models.IntegerField(default=0, verbose_name="工作年限")
company = models.CharField(verbose_name="就職公司",max_length=50)
post = models.CharField(verbose_name="公司職位",max_length=10)
teach_feature = models.CharField(verbose_name="教學(xué)特點(diǎn)",max_length=50)
click_nums = models.IntegerField(verbose_name="點(diǎn)擊人數(shù)", default=0)
fav_nums = models.IntegerField(verbose_name="收藏人數(shù)", default=0)
age = models.IntegerField(default=0, verbose_name="年齡")
image = models.ImageField(upload_to="teacher/%Y/%m", verbose_name="頭像", max_length=100)
class Meta:
verbose_name = "教師信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
- 遷移數(shù)據(jù)庫(kù)
makemigrations
migrate
- 在apps/oragnizations/文件夾中建立一個(gè)xadmin.py文件
import xadmin
from apps.organizations.models import City,Teacher,CourseOrg
class CityAdmin(object):
list_display = ['id', 'name', 'descirption']
pass
class TeacherAdmin(object):
list_display = ['id', 'name', 'age', 'years', 'company', 'post']
pass
class CourseOrgAdmin(object):
list_display = ['id', 'name', 'tag', 'category', 'org', 'attestation', 'gold']
pass
xadmin.site.register(City,CityAdmin)
xadmin.site.register(Teacher,TeacherAdmin)
xadmin.site.register(CourseOrg,CourseOrgAdmin)
- 在apps/oragnizations//apps.py文件中:
verbose_name="機(jī)構(gòu)信息"
-
刷新頁面: