1.隨機選取
功能:隨機從數據庫選目標顯示在前臺
定義 urls ,models 等
這裏我定義了一個 user表裏面有三個用戶如下
當然這是通過後臺管理員添加同步到數據庫中
在 views視圖中寫入函數
detail.html
可以看出,q 對應的 context 中的 q
隨機拿出兩個對象獲取他們的 name 屬性
效果如下
每刷新一次,重新隨機選取一次
context 用來傳參
2.篩選條件
同樣在 views文件中
請注意:傳入參數只能是字典形式
上圖中 q 是對象,q.query 是 python查找語句對應的 sql 查找語句。如下
其中
select * from 練習_user where id=1 等價於
User.objects.get(id=1)
‘練習’ 是我的數據庫名
注意: get()只能返回一個對象,
要返回一堆的話用 User.objects.all() 或 filter(加限定條件)
index.html
結果圖
2.評論功能
目的:用戶登陸後完成評論,評論對他人可見,並被保存在數據庫中
應用: form 表單 , views 視圖 , index.html
這裏我們只需要修改前面代碼
(1)增加評論類並同步到數據庫與後臺
注意:當完成一整個項目時,models 一定要寫全,否則後面添加很麻煩
這裏返回的 self.content 只有調用 Comment.objects.all() 時纔會返回評論對象,這裏
返回的是 評論內容; 如果是 self.name 則返回評論人名字
後面會有例子
(2)增加表單(和 views.py 同級)
forms.py
這裏定義的字段和 comment 類字段相同
記得在 admin.py添加
admin.site.register(Comment)
views.py 修改爲
index.html (在 body 中寫入 )
這裏是一定要說道說道的,使用 comment 將 Comment類實例化成對象;
form 表單默認使用 post 方法,接着實例化 Commentform類,判斷 form對象是否存在,
如果存在保存在數據庫,不存在返回空;最終以參數方式傳入 index.html;
而 index中第二行是爲了防止跨站請求僞造攻擊
效果如下
寫入信息保存後提交,仍然能看到寫入信息,並且mysql數據庫內也有
這裏context內寫入 comment 只是爲了驗證 Comment 類的返回字段
去掉後就不會返回 comment對象
我們隨機驗證一下
數據庫
附:如果想要返回其他類的屬性字段, 只需要在 context 參數中寫入並展現在 HTML頁面上即可
3.權限更改與繼承
(自定義Users和Groups組繼承django自帶的User和Groups)
我們知道 Django 後臺管理默認給增加的模型3個權限,增加,修改,刪除;
在django 2.0 之後有查看功能,那麼如果這4個權限不夠,就需要我們手動添加了。
(1)自定義權限
先導入模塊
from django.contrib.auth.models import Group,AbstractUser
這是兩個 django自帶權限管理模塊,就是我們進入 admin 後看到的認證和授權
定義model
分別是管理員和管理員組模型,權限裏面,第一個是權限名,第二個是權限功能;
再同步到 admin.py中
並在 settings.py 中添加
AUTH_USER_MODEL='zan.Users'
zan 是 app名稱 Users是第一個繼承模型
進行模型更改和數據庫遷移
python manage.py makemigrations
python manage.py migrate
定義視圖函數檢驗,在 index.html 中寫入
運行後看到
列出所擁有的全部權限
(2)設置自動添加管理員組
在 view.py 中寫入函數,並重新定義一個路由
因爲我們設置了多對多關聯,所以可以在管理員組中添加管理員
(3)後臺查看
輸入admin
這裏有一些我之前定義的模型,我們看到管理員和管理員組都存在
分別進入查看
我們擁有 django 自帶的全部權限和我們定義的新權限
當然我們可以通過
python manage.py shell 進行檢測
導入模型
Users.objects.get(username='xxx') 獲取管理員對象
Users.objects.get(username='xxx').has_perm('appname.權限名‘)
判斷是否擁有該權限 返回布爾值
Users.objects.get('username='xxx').user_permissions.all()
獲取該管理員的所有權限
Groups.objects.get(name='xxx') 獲取管理員組對象
Groups.objects.get(name='xxx').permissions.all() 獲取管理員組的所有權限
Groups.objects.get(name='xxx').permissions.clear() 清除管理員組的所有權限
user對象.user_permissions.clear() 清除管理員所有權限
user對象.user_permissions.add/remove(權限對象) 增加,刪除管理員的權限
權限對象通過導入django自帶的Permission模塊
Permission.objects.get(codename='xxx') 獲得權限對象 ,
必須是一個對象而不是查詢集
user對象.groups.remove/add(組對象) 管理員增加,刪除自己所處的管理員組