Django-admin 后臺管理(五)

admin 后臺數(shù)據(jù)庫管理

  • django 提供了比較完善的后臺管理數(shù)據(jù)庫的接口,可供開發(fā)過程中調用和測試使用
  • django 會搜集所有已注冊的模型類焰枢,為這些模型類提拱數(shù)據(jù)管理界面关炼,供開發(fā)者使用
  • 使用步驟:
    1. 創(chuàng)建后臺管理帳號:
      • 后臺管理--創(chuàng)建管理員帳號
        • $ python3 manage.py createsuperuser
        • 根據(jù)提示完成注冊,參考如下:
        $ python3 manage.py createsuperuser
        Username (leave blank to use 'tarena'): tarena  # 此處輸入用戶名
        Email address: laowei@tedu.cn  # 此處輸入郵箱
        Password: # 此處輸入密碼(密碼要復雜些围来,否則會提示密碼太簡單)
        Password (again): # 再次輸入重復密碼
        Superuser created successfully.
        $ 
        
    2. 用注冊的帳號登陸后臺管理界面

注冊自定義模型類

  • 若要自己定義的模型類也能在 /admin 后臺管理界中顯示和管理痛垛,需要將自己的類注冊到后臺管理界面
  • 添加自己定義模型類的后臺管理數(shù)據(jù)表的,需要用admin.site.register(自定義模型類) 方法進行注冊
    • 配置步驟如下:
      1. 在應用app中的admin.py中導入注冊要管理的模型models類, 如:
        from .models import Book
        
      2. 調用 admin.site.register 方法進行注冊,如:
        from django.contrib import admin
        admin.site.register(自定義模型類)
        
    • 如: 在 bookstore/admin.py 添加如下代碼對Book類進行管理
    • 示例:
      # file: bookstore/admin.py
      from django.contrib import admin
      # Register your models here.
      
      from . import models
      ...
      admin.site.register(models.Book)  # 將Book類注冊為可管理頁面
      

修改自定義模型類的展現(xiàn)樣式

  • 在admin后臺管理數(shù)據(jù)庫中對自定義的數(shù)據(jù)記錄都展示為 XXXX object 類型的記錄,不便于閱讀和判斷
  • 在用戶自定義的模型類中可以重寫 def __str__(self): 方法解決顯示問題,如:
    • 在 自定義模型類中重寫 str(self) 方法返回顯示文字內容:
    class Book(models.Model):
        ...
        def __str__(self):
            return "書名" + self.title
    

模型管理器類

  • 作用:

    • 為后臺管理界面添加便于操作的新功能粹淋。
  • 說明:

    • 后臺管理器類須繼承自 django.contrib.admin 里的 ModelAdmin
  • 模型管理器的使用方法:

    1. <應用app>/admin.py 里定義模型管理器類
      class XXXXManager(admin.ModelAdmin):
          ......
      
    2. 綁定注冊模型管理器和模型類
      from django.contrib import admin
      from .models import *
      admin.site.register(YYYY, XXXXManager) # 綁定 YYYY 模型類與 管理器類 XXXXManager
      
    • 示例:
      # file : bookstore/admin.py
      from django.contrib import admin
      from .models import Book
      
      class BookManager(admin.ModelAdmin):
          list_display = ['id', 'title', 'price', 'market_price']
      
      admin.site.register(Book, BookManager)
      
  • 模型管理器類ModelAdmin中實現(xiàn)的高級管理功能

    1. list_display 去控制哪些字段會顯示在Admin 的修改列表頁面中吸祟。
    2. list_display_links 可以控制list_display中的字段是否應該鏈接到對象的“更改”頁面。
    3. list_filter 設置激活Admin 修改列表頁面右側欄中的過濾器
    4. search_fields 設置啟用Admin 更改列表頁面上的搜索框桃移。
    5. list_editable 設置為模型上的字段名稱列表欢搜,這將允許在更改列表頁面上進行編輯。
    6. 其它參見https://docs.djangoproject.com/en/2.2/ref/contrib/admin/

再談Meta類

通過Meta內嵌類 定義模型類的屬性

  • 模型類可以通過定義內部類class Meta 來重新定義當前模型類和數(shù)據(jù)表的一些屬性信息

  • 用法格式如下:

    class Book(models.Model):
        title = CharField(....)
        class Meta:
            1. db_table = '數(shù)據(jù)表名'
                - 該模型所用的數(shù)據(jù)表的名稱谴轮。(設置完成后需要立馬更新同步數(shù)據(jù)庫)
            2. verbose_name = '單數(shù)名'
                - 給模型對象的一個易于理解的名稱(單數(shù)),用于顯示在/admin管理界面中
            3. verbose_name_plural = '復數(shù)名'
                - 該對象復數(shù)形式的名稱(復數(shù)),用于顯示在/admin管理界面中
    
  • 練習:

    • 將Author 模型類加入后臺管理
    • 制作一個AuthorManager管理器類,讓后臺管理Authors列表中顯示作者的ID吹埠、姓名第步、年齡信息
    • 用后臺管理程序 添加三條 Author 記錄
    • 修改其中一條記錄的年齡 - Author
    • 刪除最后一條添加的記錄 - Author

數(shù)據(jù)表關聯(lián)關系映射

  • 常用的表關聯(lián)方式有三種:
    1. 一對一映射
      • 如: 一個身份證對應一個人
    2. 一對多映射
      • 如: 一個班級可以有多個學生
    3. 多對多映射
      • 如: 一個學生可以報多個課程,一個課程可以有多個學生學習

一對一映射

  • 一對一是表示現(xiàn)實事物間存在的一對一的對應關系缘琅。
  • 如:一個家庭只有一個戶主粘都,一個男人有一個妻子,一個人有一個唯一的指紋信息等

語法

class A(model.Model):
    ...
class B(model.Model):
    屬性 = models.OneToOneField(A, on_delete=xxx)

外鍵類字段選項

  • 特殊字段參數(shù)【必須項】:

    • on_delete
      1. models.CASCADE 級聯(lián)刪除刷袍。 Django模擬SQL約束ON DELETE CASCADE的行為翩隧,并刪除包含F(xiàn)oreignKey的對象。
      2. models.PROTECT 拋出ProtectedError 以阻止被引用對象的刪除;[等同于mysql默認的RESTRICT]
      3. models.SET_NULL 設置ForeignKey null呻纹;需要指定null=True
      4. models.SET_DEFAULT 將ForeignKey設置為其默認值堆生;必須設置ForeignKey的默認值。
      5. ... 其它參請參考文檔 https://docs.djangoproject.com/en/2.2/ref/models/fields/#foreignkey
  • 其余常用的字段選項【非必須項】雷酪;如:

    1. null
    2. unique 等

用法示例

  1. 創(chuàng)建作家和作家妻子類
    # file : xxxxxxxx/models.py
    from django.db import models
    
    class Author(models.Model):
        '''作家模型類'''
        name = models.CharField('作家', max_length=50)
    
    class Wife(models.Model):
        '''作家妻子模型類'''
        name = models.CharField("妻子", max_length=50)
        author = models.OneToOneField(Author, on_delete=models.CASCADE)  # 增加一對一屬性 
    
  2. 創(chuàng)建一對一的數(shù)據(jù)記錄
    from .models import *
    author1 = Author.objects.create(name='王老師')
    wife1 = Wife.objects.create(name='王夫人', author=author1)  # 關聯(lián)王老師
    author2 = Author.objects.create(name='小澤老師')  # 一對一可以沒有數(shù)據(jù)對應的數(shù)據(jù) 
    
  3. 數(shù)據(jù)查詢
    1. 正向查詢

      • 直接通過關聯(lián)屬性查詢即可
      # 通過 wife 找 author
      from .models import Wife
      wife = Wife.objects.get(name='王夫人')
      print(wife.name, '的老公是', wife.author.name)
      
    2. 反向查詢

      • 通過反向關聯(lián)屬性查詢
      • 反向關聯(lián)屬性為實例對象.引用類名(小寫)淑仆,如作家的反向引用為作家對象.wife
      • 當反向引用不存在時,則會觸發(fā)異常
      # 通過 author.wife 關聯(lián)屬性 找 wife,如果沒有對應的wife則觸發(fā)異常
      author1 = Author.objects.get(name='王老師')
      print(author1.name, '的妻子是', author1.wife.name)
      author2 = Author.objects.get(name='小澤老師')
      try:
          print(author2.name, '的妻子是', author2.wife.name)
      except:
          print(author2.name, '還沒有妻子')
      

一對多映射

  • 一對多是表示現(xiàn)實事物間存在的一對多的對應關系哥力。
  • 如:一個學校有多個班級,一個班級有多個學生, 一本圖書只能屬于一個出版社,一個出版社允許出版多本圖書
  1. 語法

    • 當一個A類對象可以關聯(lián)多個B類對象時
    class A(model.Model):
        ...
    
    class B(model.Model):
        屬性 = models.ForeignKey("一"的模型類, on_delete=xx)
    
  2. 用法示例

    • 有二個出版社對應五本書的情況.
      1. 清華大學出版社 有書

        1. C++
        2. Java
        3. Python
      2. 北京大學出版社 有書

        1. 西游記
        2. 水滸
  3. 創(chuàng)建模型類

    # file: otm/models.py
    from django.db import models
    
    class Publisher(models.Model):
        '''出版社【一】'''
        name = models.CharField('名稱', max_length=50, unique=True)
    
    class Book(models.Model):
        '''書【多】'''
        title = models.CharField('書名', max_length=50)
        publisher = ForeignKey(Publisher, on_delete=models.CASCADE)
        
    
  4. 創(chuàng)建數(shù)據(jù)

    #先創(chuàng)建 '一' 蔗怠,再創(chuàng)建 '多'
    from .models import *
    pub1 = Publisher.objects.create(name='清華大學出版社')
    Book.objects.create(title='C++', publisher=pub1)
    Book.objects.create(title='Java', publisher_id=1)
    
    #高級創(chuàng)建 - 利用 反向屬性
    pub2 = Publisher.objects.create(name='北京大學出版社')
    pub2.book_set.create(title='西游記')
    
  1. 數(shù)據(jù)查詢

    通過 Book 查詢 Publisher【正向】

    通過 publisher 屬性查詢即可
    book.publisher
     
    abook = Book.objects.get(id=1)
    print(abook.title, '的出版社是:', abook.publisher.name)
    

    通過 Publisher 查詢 對應的所有的 Book 【反向】

    Django會在Publisher中增加一個屬性來表示對對應的Book們的查詢引用
    屬性:book_set  等價于 objects
    
    # 通過出版社查詢對應的書
    pub1 = Publisher.objects.get(name='清華大學出版社')
    books = pub1.book_set.all()  # 通過book_set 獲取pub1對應的多個Book數(shù)據(jù)對象
    #books = Book.objects.filter(publisher=pub1)  # 也可以采用此方式獲取
    print("清華大學出版社的書有:")
    for book in books:
       print(book.title)
    

多對多映射

  • 多對多表達對象之間多對多復雜關系,如: 每個人都有不同的學校(小學吩跋,初中寞射,高中,...),每個學校都有不同的學生...
  1. 語法

    • 在關聯(lián)的兩個類中的任意一個類中,增加:
    屬性 = models.ManyToManyField(MyModel)
    
  2. 用法示例

    • 一個作者可以出版多本圖書
    • 一本圖書可以被多名作者同時編寫
    class Author(models.Model):
        ...
    
    class Book(models.Model):
        ...
        authors = models.ManyToManyField(Author)
    
  3. 創(chuàng)建模型類

    class Author(models.Model):
        '''作家模型類'''
        name = models.CharField('作家', max_length=50)
        def __str__(self):
            return self.name
        
    class Book(models.Model):
        '''書模型類'''
        title = models.CharField('書名', max_length=50)
        authors = models.ManyToManyField(Author)
        def __str__(self):
            return self.title 
    
  4. 創(chuàng)建數(shù)據(jù)

    方案1 先創(chuàng)建 author 再關聯(lián) book
        author1 = Author.objects.create(name='呂老師')
        author2 = Author.objects.create(name='王老師')
        # 呂老師和王老師同時寫了一本Python
        book11 = author1.book_set.create(title="Python")
        author2.book_set.add(book11) 
        
    方案2 先創(chuàng)建 book 再關聯(lián) author
        book = Book.objects.create(title='python1')
        #郭小鬧和呂老師都參與了 python1 的 創(chuàng)作
        author3 = book.authors.create(name='guoxiaonao')
        book.authors.add(author1)
    
  1. 數(shù)據(jù)查詢

    1. 通過 Book 查詢對應的所有的 Author【正向】
    book.authors.all() -> 獲取 book 對應的所有的author的信息
    book.authors.filter(age__gt=80) -> 獲取book對應的作者中年齡大于80歲的作者的信息
    
    1. 通過 Author 查詢對應的所有的Book【反向】
    • Django會生成一個反向屬性 book_set 用于表示對對應的book的查詢對象相關操作
    author.book_set.all()
    author.book_set.filter()
    

cookies 和 session

  • 會話 - 從打開瀏覽器訪問一個網(wǎng)站,到關閉瀏覽器結束此次訪問锌钮,稱之為一次會話
  • HTTP協(xié)議是無狀態(tài)的桥温,導致會話狀態(tài)難以保持
  • 試想一下,如果不保持會話狀態(tài)梁丘,在電商網(wǎng)站購物的場景
    體驗策治?

Cookies和Session就是為了保持會話狀態(tài)而誕生的兩個存儲技術

cookies

  • cookies是保存在客戶端瀏覽器上的存儲空間

  • Chrome 瀏覽器 可能通過開發(fā)者工具的 Application >> Storage >> Cookies 查看和操作瀏覽器端所有的 Cookies 值

  • 火狐瀏覽器 可能通過開發(fā)者工具的 存儲 -> Cookie

    • cookies 在瀏覽器上是以鍵-值對的形式進行存儲的脓魏,鍵和值都是以ASCII字符串的形存儲(不能是中文字符串)

    • cookies中的數(shù)據(jù)是按域存儲隔離的,不同的域之間無法訪問

    • cookies 的內部的數(shù)據(jù)會在每次訪問此網(wǎng)址時都會攜帶到服務器端通惫,如果cookies過大會降低響應速度

  • 在Django 設置瀏覽器的COOKIE 必須通過 HttpResponse 對象來完成

    • 添加茂翔、修改COOKIE

      • HttpResponse.set_cookie(key, value='', max_age=None, expires=None)
        • key:cookie的名字
        • value:cookie的值
        • max_age:cookie存活時間,秒為單位
        • expires:具體過期時間
        • 當不指定max_age和expires 時,關閉瀏覽器時此數(shù)據(jù)失效
    • 刪除COOKIE

      • HttpResponse.delete_cookie(key)
      • 刪除指定的key 的Cookie履腋。 如果key 不存在則什么也不發(fā)生珊燎。
    • 獲取cookie

      • 通過 request.COOKIES 綁定的字典(dict) 獲取客戶端的 COOKIES數(shù)據(jù)

        value = request.COOKIES.get('cookies名', '默認值')
        print("cookies名 = ", value)
        
  • 示例

    • 以下示例均在視圖函數(shù)中調用
    • 添加cookie
      # 為瀏覽器添加鍵為 my_var1,值為123,過期時間為1個小時的cookie
      responds = HttpResponse("已添加 my_var1,值為123")
      responds.set_cookie('my_var1', 123, 3600)
      return responds
      
    • 修改cookie
      # 為瀏覽器添加鍵為 my_var1,修改值為456遵湖,過期時間為2個小時的cookie
      responds = HttpResponse("已修改 my_var1,值為456")
      responds.set_cookie('my_var1', 456, 3600*2)
      return responds 
      
    • 刪除cookie
      # 刪除瀏覽器鍵為 my_var1的cookie
      responds = HttpResponse("已刪除 my_var1")
      responds.delete_cookie('my_var1')
      return responds
      
    • 獲取cookie
      # 獲取瀏覽器中 my_var變量對應的值
      value = request.COOKIES.get('my_var1', '沒有值!')
      print("cookie my_var1 = ", value)
      return HttpResponse("my_var1:" + value)
      

session

  • session又名會話控制悔政,是在服務器上開辟一段空間用于保留瀏覽器和服務器交互時的重要數(shù)據(jù)

  • 實現(xiàn)方式

    • 使用 session 需要在瀏覽器客戶端啟動 cookie,且用在cookie中存儲sessionid
    • 每個客戶端都可以在服務器端有一個獨立的Session
    • 注意:不同的請求者之間不會共享這個數(shù)據(jù)延旧,與請求者一一對應
  • Django中配置Session

    • 在 settings.py 文件中
    • 向 INSTALLED_APPS 列表中添加:
      INSTALLED_APPS = [
          # 啟用 sessions 應用
          'django.contrib.sessions',
      ]
      
    • 向 MIDDLEWARE 列表中添加:
      MIDDLEWARE = [
          # 啟用 Session 中間件
          'django.contrib.sessions.middleware.SessionMiddleware',
      ]
      
  • session的基本操作:

    • session對于象是一個類似于字典的SessionStore類型的對象, 可以用類擬于字典的方式進行操作
    • session 只能夠存儲能夠序列化的數(shù)據(jù),如字典谋国,列表等。
    1. 保存 session 的值到服務器

      • request.session['KEY'] = VALUE
    2. 獲取session的值

      • VALUE = request.session['KEY']
      • VALUE = request.session.get('KEY', 缺省值)
    3. 刪除session的值

      • del request.session['KEY']`
  • 在 settings.py 中有關 session 的設置

    1. SESSION_COOKIE_AGE
      • 作用: 指定sessionid在cookies中的保存時長(默認是2周)迁沫,如下:
      • SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    2. SESSION_EXPIRE_AT_BROWSER_CLOSE = True
      設置只要瀏覽器關閉時,session就失效(默認為False)
  • 注: 當使用session時需要遷移數(shù)據(jù)庫,否則會出現(xiàn)錯誤

python3 manage.py migrate
django 原生session 問題:
1芦瘾,django_session表是 單表設計; 且該表數(shù)據(jù)量持續(xù)增持【瀏覽器故意刪掉sessionid&過期數(shù)據(jù)未刪除】
2集畅,可以每晚執(zhí)行 python3 manage.py clearsessions 【該命令可刪除已過期的session數(shù)據(jù)】

Cookies vs session

存儲位置:
C- 瀏覽器中   s- 服務器中【mysql】
安全性:
C - 不安全    s- 相對安全一些
不管C還是S , 不要存儲敏感數(shù)據(jù) 【密碼】
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末近弟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挺智,更是在濱河造成了極大的恐慌祷愉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦颇,死亡現(xiàn)場離奇詭異二鳄,居然都是意外死亡,警方通過查閱死者的電腦和手機媒怯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門泥从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沪摄,你說我怎么就攤上這事躯嫉。” “怎么了杨拐?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵祈餐,是天一觀的道長。 經(jīng)常有香客問我哄陶,道長帆阳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任屋吨,我火速辦了婚禮蜒谤,結果婚禮上山宾,老公的妹妹穿的比我還像新娘。我一直安慰自己鳍徽,他們只是感情好资锰,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阶祭,像睡著了一般绷杜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上濒募,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天鞭盟,我揣著相機與錄音杠茬,去河邊找鬼渣触。 笑死,一個胖子當著我的面吹牛顶猜,可吹牛的內容都是我干的晌姚。 我是一名探鬼主播粤剧,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舀凛!你這毒婦竟也來了?” 一聲冷哼從身側響起途蒋,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤猛遍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后号坡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懊烤,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年宽堆,在試婚紗的時候發(fā)現(xiàn)自己被綠了腌紧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡畜隶,死狀恐怖壁肋,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情籽慢,我是刑警寧澤浸遗,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站箱亿,受9級特大地震影響跛锌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜届惋,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一髓帽、第九天 我趴在偏房一處隱蔽的房頂上張望菠赚。 院中可真熱鬧,春花似錦郑藏、人聲如沸衡查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峡捡。三九已至,卻和暖如春筑悴,著一層夾襖步出監(jiān)牢的瞬間们拙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工阁吝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砚婆,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓突勇,卻偏偏與公主長得像装盯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甲馋,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容

  • 模塊間聯(lián)系越多埂奈,其耦合性越強,同時表明其獨立性越差( 降低耦合性定躏,可以提高其獨立性)账磺。軟件設計中通常用耦合度和內聚...
    riverstation閱讀 2,076評論 0 8
  • 注:適用于 2.x 版本 1.pip 命令安裝方法 pip install Django #指定版本 Django...
    華爾街的主導曲閱讀 882評論 0 0
  • 聚合查詢 聚合查詢是指對一個數(shù)據(jù)表中的一個字段的數(shù)據(jù)進行部分或全部進行統(tǒng)計查詢,查bookstore_book數(shù)據(jù)...
    南坡三舅閱讀 351評論 0 0
  • 一、CBV版視圖二痊远、給視圖加裝飾器三垮抗、request對象常用屬性四、url:路由系統(tǒng)五碧聪、命名url和url的反向解...
    清風徐來_簡閱讀 423評論 0 1
  • course 1 django install django-admin startproject jstest ...
    jshan閱讀 187評論 0 1