解决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 Tkinter简单布局实例教程
Sep 03 Python
python实现得到一个给定类的虚函数
Sep 28 Python
Python中的tuple元组详细介绍
Feb 02 Python
python使用pymysql实现操作mysql
Sep 13 Python
python多线程socket编程之多客户端接入
Sep 12 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
ubuntu上安装python的实例方法
Sep 30 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
python连接PostgreSQL过程解析
Feb 09 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
php购物车实现方法
2015/01/03 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
PHP中的self关键字详解
2019/06/23 PHP
在视频前插入广告
2006/11/20 Javascript
JTrackBar水平拖动效果
2007/07/15 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
Python部署web开发程序的几种方法
2017/05/05 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
大学毕业生通用求职信
2013/09/28 职场文书
会计专业自我鉴定范文
2013/10/06 职场文书
企业管理标语
2014/06/10 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis