第2天

增加用戶

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),
]

表設(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)信息"
  • 刷新頁面:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靶擦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雇毫,更是在濱河造成了極大的恐慌奢啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘴拢,死亡現(xiàn)場(chǎng)離奇詭異桩盲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)席吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赌结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孝冒,你說我怎么就攤上這事柬姚。” “怎么了庄涡?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵量承,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)撕捍,這世上最難降的妖魔是什么拿穴? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮忧风,結(jié)果婚禮上默色,老公的妹妹穿的比我還像新娘。我一直安慰自己狮腿,他們只是感情好腿宰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缘厢,像睡著了一般吃度。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贴硫,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天规肴,我揣著相機(jī)與錄音,去河邊找鬼夜畴。 笑死拖刃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贪绘。 我是一名探鬼主播兑牡,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼税灌!你這毒婦竟也來了均函?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤菱涤,失蹤者是張志新(化名)和其女友劉穎苞也,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘秆,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡如迟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攻走。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殷勘。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昔搂,靈堂內(nèi)的尸體忽然破棺而出玲销,到底是詐尸還是另有隱情,我是刑警寧澤摘符,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布贤斜,位于F島的核電站策吠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瘩绒。R本人自食惡果不足惜猴抹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望草讶。 院中可真熱鬧,春花似錦炉菲、人聲如沸堕战。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘱丢。三九已至,卻和暖如春祠饺,著一層夾襖步出監(jiān)牢的瞬間越驻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工道偷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀旁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓勺鸦,卻偏偏與公主長(zhǎng)得像并巍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子换途,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355