ホームページ > バックエンド開発 > Python チュートリアル > Django テンプレートが perms 変数を使用できない問題の解決策

Django テンプレートが perms 変数を使用できない問題の解決策

巴扎黑
リリース: 2017-09-11 10:37:40
オリジナル
1734 人が閲覧しました

この記事では、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的子类.接受requestcontext_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 のサブクラスであり、requestcontext_processors を受け入れます。 render_to_response メソッドを使用しているため、コンテキストを埋めてテンプレートにレンダリングするという問題はすでに明らかになっており、 context_instance=RequestContext(request) により、テンプレートは <code>{{ perms }} 変数を使用できなくなります🎜

以上がDjango テンプレートが perms 変数を使用できない問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート