解决Django模板无法使用perms变量问题的方法


Posted in Python onSeptember 10, 2017

前言

本文主要给大家介绍了关于Django模板无法使用perms变量的解决方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

解决方法:

首先,在使用Django内置权限管理系统时,settings.py文件要添加

INSTALLED_APPS添加:
'django.contrib.auth',

 
MIDDLEWARE添加:
'django.contrib.auth.middleware.AuthenticationMiddleware',

'django.contrib.auth.context_processors.auth',
TEMPLATES = [
 {
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [os.path.join(BASE_DIR, 'templates')],
  'APP_DIRS': True,
  'OPTIONS': {
   'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.i18n',
    'django.template.context_processors.media',
    'django.template.context_processors.static',
    'django.template.context_processors.tz',
    'django.contrib.messages.context_processors.messages',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
   ],
  },
 },
]

如何在模板进行权限检查呢?

根据官网说明 https://docs.djangoproject.com/en/1.11/topics/auth/default/#permissions ,已登录用户权限保存在模板{{ perms }}变量中,是权限模板代理django.contrib.auth.context_processors.PermWrapper的一个实例,具体可以查看django/contrib/auth/context_processors.py源码

测试用例:

解决Django模板无法使用perms变量问题的方法 

测试过程中,发现{{ perms }}变量压根不存在,没有任何输出;好吧,只能取Debug Django的源码了

def auth(request):
 """
 Returns context variables required by apps that use Django's authentication
 system.

 If there is no 'user' attribute in the request, uses AnonymousUser (from
 django.contrib.auth).
 """
 if hasattr(request, 'user'):
  user = request.user
 else:
  from django.contrib.auth.models import AnonymousUser
  user = AnonymousUser()
 print(user, PermWrapper(user), '-----------------------')
 return {
  'user': user,
  'perms': PermWrapper(user),
 }

测试访问接口,发现有的接口有打印权限信息,有的没有,似乎恍然醒悟

可以打印权限信息的接口返回:

return render(request, 'fms/fms_add.html', {'request': request, 'form': form, 'error': error})

不能打印权限新的接口返回:

return render_to_response( 'fms/fms.html', data)

render和render_to_response区别

render是比render_to_reponse更便捷渲染模板的方法,会自动使用RequestContext,而后者需要手动添加:

return render_to_response(request, 'fms/fms_add.html', {'request': request, 'form': form, 'error': error},context_instance=RequestContext(request))

其中RequestContext是django.template.Context的子类.接受requestcontext_processors ,从而将上下文填充渲染到模板问题已经很明确,由于使用了render_to_response方法,没有手动添加context_instance=RequestContext(request)导致模板不能使用{{ perms }}变量

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
简单说明Python中的装饰器的用法
Apr 24 Python
在Python中使用模块的教程
Apr 27 Python
python类和继承用法实例
Jul 07 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
python同步两个文件夹下的内容
Aug 29 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Python列表的索引与切片
Apr 07 Python
Python 一键获取电脑浏览器的账号密码
May 11 Python
python实现批量修改文件名代码
Sep 10 #Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 #Python
Python上下文管理器和with块详解
Sep 09 #Python
Python使用asyncio包处理并发详解
Sep 09 #Python
Python协程的用法和例子详解
Sep 09 #Python
python利用dir函数查看类中所有成员函数示例代码
Sep 08 #Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 #Python
You might like
世界上第一台立体声收音机
2021/03/01 无线电
索尼ICF-SW100收音机评测
2021/03/02 无线电
php多文件上传功能实现原理及代码
2013/04/18 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
javascript RadioButtonList获取选中值
2009/04/09 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python 时间处理datetime实例
2008/09/06 Python
python多重继承实例
2014/10/11 Python
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
Hotels.com南非:酒店预订
2017/11/02 全球购物
党员大会主持词
2014/04/02 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
春季防火方案
2014/05/10 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Linux中各个目录的作用与内容
2022/06/28 Servers