Django 템플릿에서 perms 변수를 사용할 수 없는 문제에 대한 해결 방법

巴扎黑
풀어 주다: 2017-09-11 10:37:40
원래의
1703명이 탐색했습니다.

이 글에서는 주로 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 }}变量中,是权限模板代理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 }}

🎜테스트 사례:🎜🎜

🎜🎜테스트 과정에서 {{ perms }} 변수가 전혀 존재하지 않고 출력도 없는 것으로 나타났습니다. 음, 소스 코드만 얻을 수 있습니다. Debug Django🎜🎜🎜🎜rrreee🎜액세스 인터페이스를 테스트한 결과 일부 인터페이스에서 권한 정보가 인쇄되고 일부는 그렇지 않은 것이 갑자기 깨어나는 것 같습니다.🎜🎜권한 정보를 인쇄할 수 있는 인터페이스가 다음과 같이 반환됩니다. 🎜🎜🎜🎜🎜rrreee🎜 권한을 인쇄할 수 없는 새 인터페이스는 다음을 반환합니다. 🎜🎜rrreee🎜🎜🎜 render와 render_to_response🎜🎜의 차이점 🎜🎜🎜render는 render_to_reponse보다 템플릿을 렌더링하는 더 편리한 방법이지만 후자는 자동으로 RequestContext를 사용합니다. 수동으로 추가해야 합니다: 🎜🎜🎜🎜rrreee🎜여기서 RequestContext는 django.template.Context의 하위 클래스입니다. requestcontext_processors를 수락합니다. 따라서 컨텍스트를 채우고 이를 템플릿에 렌더링하는 문제는 이미 명확해졌습니다. render_to_response 메서드를 사용했기 때문에 context_instance=RequestContext(request)로 인해 템플릿이 <code>{{ perms }} 변수를 사용할 수 없게 됩니다🎜

위 내용은 Django 템플릿에서 perms 변수를 사용할 수 없는 문제에 대한 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿