この記事では、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', ], }, }, ]
テンプレート内の権限を確認するにはどうすればよいですか?
公式 Web サイトの手順 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
的子类.接受request
和context_processors
,从而将上下文填充渲染到模板问题已经很明确,由于使用了render_to_response
方法,没有手动添加context_instance=RequestContext(request)
导致模板不能使用{{ perms }}
🎜🎜テスト プロセスでは、{{ perms }}
変数がまったく存在せず、出力もありませんでした。まあ、ソース コードを取得することしかできません。 Django をデバッグします🎜🎜🎜🎜rrreee🎜アクセス インターフェイスをテストしたところ、一部のインターフェイスにはアクセス許可情報が表示され、一部のインターフェイスには表示されていないことがわかり、突然起動するようです🎜🎜アクセス許可情報を表示できるインターフェイスは次のメッセージを返します: 🎜🎜🎜🎜🎜rrreee🎜権限を印刷できない新しいインターフェースは以下を返します: 🎜🎜🎜🎜🎜rrreee🎜🎜🎜 render と render_to_response の違い🎜🎜 🎜🎜🎜render は、render_to_response よりもテンプレートをレンダリングする便利な方法ですが、後者は自動的に RequestContext を使用します。手動で追加する必要があります: 🎜🎜🎜🎜rrreee🎜 ここで、RequestContext は django.template.Context
のサブクラスであり、request
と context_processors
を受け入れます。 render_to_response
メソッドを使用しているため、コンテキストを埋めてテンプレートにレンダリングするという問題はすでに明らかになっており、 context_instance=RequestContext(request) により、テンプレートは <code>{{ perms }}
変数を使用できなくなります🎜
以上がDjango テンプレートが perms 変数を使用できない問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。