有關Django模板無法使用perms變數問題的解決方法

巴扎黑
發布: 2017-09-11 10:37:40
原創
1693 人瀏覽過

這篇文章主要給大家介紹了關於解決Django模板無法使用perms變量問題的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

前言

本文主要介紹給大家介紹了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原始碼

#測試案例:

 

測試過程中,發現{{ 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 }}變數

以上是有關Django模板無法使用perms變數問題的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板