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(组对象) 管理员增加,删除自己所处的管理员组